There are several possible solutions, but I believe the following will give you consistent behavior with the other inputs:
System.out.println("Enter an floating point number: ");
double d = i.nextDouble();
i.skip("((?<!\\R)\\s)*"); // skip whitespace, stopping after any newline
System.out.println("Enter a string: ");
String str = i.nextLine();
This approach would allow you to enter all the inputs on a single line, if so desired.
For example:
1 1.2 Result is
However if you really intend for your users to press Enter after every input, then it would be most consistent to read all the inputs with Scanner's nextLine() method, then parse as needed (using Integer.parseInt, etc).
Java 9
Due to a bug in Java 9, the atomic grouping (?> ... )
must be added around the linebreak matcher \R
. See bug report JDK-8176983 for details.
i.skip("((?<!(?>\\R))\\s)*"); // skip whitespace, stopping after any newline
// Compatibility Note: Java 9 safe use of \R
This code will also work fine and not cause any problems if used for Java 8, so actually I recommend you use this workaround version in your code just to be on the safe side (e.g. if someone may copy/paste or set target to a different JDK).
Java 7 and earlier
The linebreak matcher \R
is available in Java-8 or later. Prior to that version, you would have to use the "equivalent" pattern \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
however to work as a true equivalent it actually must be wrapped in the atomic grouping (?> ... )
. See documentation bug report JDK-8176029 for details.
i.skip("((?<!(?>\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029]))\\s)*"); // skip whitespace, stopping after any newline