我正在使用这些Scanner
方法nextInt()
并nextLine()
读取输入。
看起来像这样:
System.out.println("Enter numerical value");
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)
问题是输入数值后,第一个将input.nextLine()
被跳过,第二个将input.nextLine()
被执行,因此我的输出如下所示:
Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input
我测试了我的应用程序,看起来问题出在使用中input.nextInt()
。如果我删除它,然后这两个string1 = input.nextLine()
和string2 = input.nextLine()
执行,我希望他们能。
这是因为该Scanner.nextInt
方法不会在你按“ Enter”键创建的输入中读取换行符,因此Scanner.nextLine
在读取该换行符后对return的调用。
当你使用Scanner.nextLine
afterScanner.next()
或任何Scanner.nextFoo
方法(nextLine
本身除外)时,你将遇到类似的行为。
解决方法:
Scanner.nextLine
在每个电话号码之后拨打电话,Scanner.nextInt
或Scanner.nextFoo
使用该电话号码的其余部分(包括换行符)
int option = input.nextInt();
input.nextLine(); // Consume newline left-over
String str1 = input.nextLine();
或者,甚至更好的方法是通读输入,Scanner.nextLine
然后将输入转换为所需的正确格式。例如,你可以使用Integer.parseInt(String)
方法转换为整数。
int option = 0;
try {
option = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
String str1 = input.nextLine();
@blekione。您必须使用
try-catch
,因为Integer.parseInt
将NumberFormatException
无效参数传递给该参数时将引发。稍后您将了解异常。对于EG:-Integer.parseInt("abc")
。您不希望将“ abc”转换为int吗?@blekione。因此,在上述情况下,您的代码将在此时停止,您将无法继续执行。使用异常处理,您可以处理这种情况。
后者在多大程度上更好?AFAIK Scanner#nextInt()通过允许组逗号和区域设置前缀和后缀,可以更轻松地找到正确的整数。Integer#parseInt()仅允许数字和小数点加上可选的符号。
我个人更喜欢
Scanner#hasNextFoo
预先检查而不是尝试捕获,但是也可以。使用ParseDouble有一个新问题,那就是nextDouble使用十进制(。或,)的区域配置,但是Parsedouble总是接收美国十进制(。)。