I am having trouble getting my program to respond to empty inputs. For example, say I wanted to prompt the user to enter a value for money with type BigDecimal
as well as a currency type. Here is what the program in question looks like.
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter the amount of money "
+ "and specify currency (USD or CNY): ");
// initialize variable moneyInput
BigDecimal moneyInput;
// check if moneyInput is numeric
try {
moneyInput = input.nextBigDecimal();
} catch (InputMismatchException e){
System.err.println("InputMismatchException: non-numeric value");
return;
}
// specify currency of moneyInput
String currencyType = input.next();
...
}
So here, an input like 100.00 USD
, works fine.
Enter the amount of money and specify currency (USD or CNY): 100.00 USD
$100.00 USD ≈ ¥670.17 CNY
An input like ASDF USD
appropriately results in the error message.
Enter the amount of money and specify currency (USD or CNY): ASDF USD
InputMismatchException: non-numeric value
But, how do I force the program to respond to blank inputs, either immediately pressing the return key or entering a bunch of spaces in the first line? For example:
Enter the amount of money and specify currency (USD or CNY):
1000.00 USD
$1000.00 USD ≈ ¥6701.70 CNY
In the above example, the user can just press the return key indefinitely until something readable (valid or invalid) is entered. I want to implement some way to check if the user pressed the return key without entering anything meaningful.
Another outcome that I don't know how to account for is if the user enters ONLY the monetary value, then presses [return] a bunch of times before finally inputting the currency.
Example:
Enter the amount of money and specify currency (USD or CNY): 100.00
USD
$100.00 USD ≈ ¥670.17 CNY
How do I get the program to prompt the user with something like Please specify the currency:
after a numeric value is input and the user presses [return]? Something like
Enter the amount of money and specify currency (USD or CNY): 100.00
Please specify the currency: USD
$100.00 USD ≈ ¥670.17 CNY
I was able to achieve the above functionality by changing the part after the try-catch block to:
input.nextLine();
System.out.print("Please specify the currency: ");
String currencyType = input.nextLine();
But using this method, the program loses the ability to allow the user to input both moneyInput
and currencyType
in one line, like in the first example. (And again, there is still the problem of being able to press [return] indefinitely for each of these prompts until something readable is finally input).
Thanks for reading and sorry for the long post.
Scanner
offers two basic - and sometimes conflicting - use cases:Generally speaking mixing the two is a poor idea (it works, but probably not how you intend). The token-reading methods like
next()
andnextBigDecimal()
ignore newlines.If you want to handle Enter you need to read a user's input line-by-line with
Scanner.nextLine()
and parse each line individually (i.e.line.split("\\s+")
), rather than useScanner
's token-reading methods.Some people like to use nested
Scanner
s and read input line by line with oneScanner
then pass the line into a newScanner
to tokenize just that line.For example:
If you don't want to use a nested
Scanner
there are a number of other roughly-equivalent mechanisms. Here's the gist, but you'll likely want to add additional error-handling code (e.g. ifnew BigDecimal()
throws an exception:Using
String.split()
:Using
Pattern
:Then: