Java 中 Scanner 的自定义分隔符问题

问题描述 投票:0回答:1

我想避免当我为

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()
不起作用?

java java.util.scanner delimiter
1个回答
0
投票

抛出

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()
来读取它.

© www.soinside.com 2019 - 2024. All rights reserved.