Java 即使下一个标记似乎适合数据类型,扫描器也会抛出 InputMismatchException

Java Scanner Throws InputMismatchException even when next token appears to fit data type

我目前正在使用 Java 扫描仪 class,我收到了一个非常奇怪的 InputMismatchException。我这样初始化扫描仪:

Scanner in = new Scanner(new File(fileName));

in.useDelimiter("\n?.*:");

当我调用 System.out.println(in.next()); 时,它会将 1500 打印到命令行,这是正确的值。但是,如果我调用 System.out.println(in.nextInt());,扫描器将抛出 InputMismatchException。我不认为我正在打印尾随换行符或空格,我有点迷茫为什么会这样。

编辑:这是我正在阅读的数据格式:

Data Description:100 Next Data Description:200

编辑:调用 Integer.parseInt(in.next()); 结果是 NumberFormatException: For input string: "1"00

InputMismatchException 一点也不奇怪,因为您的正则表达式不跨平台兼容。您可能是 Windows 用户,因此您的文本文件将具有 \r\n 作为行尾,而不仅仅是 \n.

因此正确的模式应该是:

in.useDelimiter("\r?\n?.*:");

接受\r\n或单个\n

您也可以尝试使用 System.lineSeparator() 来支持不同的行结尾,但是您需要用括号将其括起来,以便正则表达式量词 ? 适用于两个字符 \r\n 对于 Windows 个系统:

in.useDelimiter(String.format("(%s)?.*:", System.lineSeparator()));

该方法的问题在于,当使用 Windows 作为操作系统时失败,但从其他地方接收文件,而其他地方本身只使用 \n。所以我推荐第一种方法。