我想避免当我为
nextInt()
输入数字时按回车键生成的“换行符”问题,因为nextLine()
会消耗新行符并且不会让我输入字符串.
我使用自定义分隔符来避免此问题,以便
nextInt()
也可以消耗行尾字符
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
sc.useDelimiter("\\n");
System.out.println("Enter your age");
int age=sc.nextInt();
System.out.println("Enter your name");
String name=sc.nextLine();
System.out.println("Age is "+ age);
System.out.println("Name is "+ name);
}
}
但是,当我运行这个程序时,我收到此错误:
Enter your age
4
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Test.main(Test.java:8)
我不明白为什么我会收到 InputMismatchException。 有人可以解释一下这个分隔符是如何工作的吗?
正如@Abra 在评论中指出的,如果我使用
next()
而不是 nextLine()
,它会按预期工作。问题是为什么 nextLine()
不起作用?
抛出
InputMismatchException
是因为您在操作系统中使用了错误的行分隔符。 nextInt
读取下一个标记(即在分隔符之前停止)。由于您输入了 4\r\n
,下一个标记是 4\r
,它不是有效的 int。
首先,为您的操作系统使用正确的行分隔符。独立于平台的方法是:
sc.useDelimiter(Pattern.quote(System.lineSeparator()));
现在扫描仪可以正确读取 int,但是
nextLine
仍然读取到空字符串。
next
或 nextInt
等不同,nextLine
不关心分隔符。它看到前面的 \r\n
,并确定这是当前行的末尾,并返回之前的所有内容。
:nextLine
使扫描仪前进到当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头(在本例中,没有任何内容)。
: 从此扫描仪查找并返回下一个完整标记。完整的标记前面和后面是与分隔符模式匹配的输入。next
另请参阅课程文档中的散文:
next() 和 hasNext() 方法及其配套方法(例如 nextInt() 和 hasNextInt())首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。
读取 int 后,剩余的输入将是
\r\nJohn Doe\r\n
,John Doe
前面和后面是分隔符 - 这与“完整标记”的含义完全匹配,因此您可以使用 next()
来读取它.