package org.yi.happy.console;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class DemoInput {
/**
* A demo of prompting for and reading validated data from standard input.
*/
public static void main(String[] args) {
try {
/*
* get a usable line reader.
*/
BufferedReader in = new BufferedReader(new InputStreamReader(
System.in));
/*
* the result of the read loop
*/
String word = null;
/*
* keep going until we get what we want
*/
while (true) {
/*
* ask the question
*/
System.out.print("enter a word: ");
/*
* get the answer
*/
String line = in.readLine();
/*
* is the answer what we want?
*/
if (line.matches("\\w+")) {
/*
* save the answer and done
*/
word = line;
break;
} else {
/*
* report a bad answer and repeat
*/
System.out.println("that does not look like a word: "
+ line);
continue;
}
}
/*
* the result of the read loop
*/
double number = 0;
/*
* keep going until we get what we want
*/
while (true) {
/*
* ask the question
*/
System.out.print("enter a number: ");
/*
* get the answer
*/
String line = in.readLine();
/*
* parse the answer
*/
try {
number = Double.parseDouble(line);
/*
* range checks can go here (on failure do a continue, on
* accept do a break)
*/
/*
* it was good, done
*/
break;
} catch (NumberFormatException e) {
/*
* it was not good, report the bad answer and repeat
*/
System.out.println("that does not look like a number: "
+ line);
continue;
}
}
/*
* if we get here we have two good answers.
*/
/*
* do something using the input
*/
System.out.println("the word was " + word + " and the number was "
+ number);
} catch (IOException e) {
/*
* there was an error, so display it and give up
*/
e.printStackTrace();
}
}
}
I don't think I can make it any simpler and still repeat the prompting for input until valid input is given. If there were many inputs being done I could break the logic out into an instance of the template pattern.
No comments:
Post a Comment