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
。所以我推荐第一种方法。
我目前正在使用 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
。所以我推荐第一种方法。