我目前正在使用 Java Scanner 类,但遇到了一个非常奇怪的 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()
来支持不同的行结尾,但随后您需要用括号将其括起来,以便正则表达式量词 ?
适用于 Windows 系统的两个字符 \r\n
:
in.useDelimiter(String.format("(%s)?.*:", System.lineSeparator()));
这种方法的问题是,当使用 Windows 作为操作系统,但从其他地方接收文件时,它会失败,而其他地方本身只使用 \n
。所以我推荐第一种方法。
关于即使下一个标记似乎适合数据类型,Java 扫描器也会抛出 InputMismatchException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44975327/