1

我在java5中使用scanner类,下面的代码会抛出异常:

Scanner scanner = new Scanner
        (new File(args[0]));
int dealId;
while (scanner.hasNextLine()) {
    dealId = scanner.nextInt();
    System.out.println(dealId);
}
scanner.close();

堆栈跟踪是:

Exception in thread "main" java.lang.NullPointerException
   at java.util.regex.Matcher.toMatchResult(libgcj.so.10)
   at java.util.Scanner.myCoreNext(libgcj.so.10)
   at java.util.Scanner.myPrepareForNext(libgcj.so.10)
   at java.util.Scanner.myNextLine(libgcj.so.10)
   at java.util.Scanner.hasNextLine(libgcj.so.10)

有谁知道是什么导致了这个异常?

4

2 回答 2

2

GCJ 主页建议它“支持大多数 1.4 库以及一些 1.5 附加功能。”

Scanner 是在 1.5 版中添加的,我怀疑您遇到了 GCJ 不支持的功能。你需要尝试一些不同的东西,看看你能得到什么。

您有什么理由不使用 OpenJDK/Oracle Java 6 或 7?(出于性能原因,请不要说它;)

于 2012-03-08T10:20:59.797 回答
0

我重现了错误并找到了解决方法

这是在 x86_64 GNU/Linux、Fedora 和 Java 1.5.0 上编译的代码:

Scanner r = new Scanner(f, "ISO-8859-1");
while(r.hasNext()){
    String line = r.nextLine();   //The guts of nextLine(), specifically: 
                                  //Matcher.toMatchResult bubbles up a 
                                  //nullPointerException
}

该文件仅包含两个由换行符分隔的 ascii 单词。运行时异常仅在 nextLine 处理文件的最后一行时发生,无论它是否有字符:

java.lang.NullPointerException
   at java.util.regex.Matcher.toMatchResult(libgcj.so.10)
   at java.util.Scanner.myCoreNext(libgcj.so.10)
   at java.util.Scanner.myPrepareForNext(libgcj.so.10)
   at java.util.Scanner.myNextLine(libgcj.so.10)
   at java.util.Scanner.nextLine(libgcj.so.10)
   at Main.parseFile(Main.java:1449)
   at Main.construct(Main.java:1420)
   at Main.populateBlogPosts(Main.java:1399)
   at Main.main(Main.java:263)

这是关于此问题的错误报告:https ://bugs.openjdk.java.net/browse/JDK-6178785

诊断

这是 libgcj.so.10 中的一个错误,完全合法的 ascii 输入以及空白字符串会导致它在文件的最后一行产生 NPE。

解决方法

由于此错误仅发生在文件的最后一行,因此解决方法是首先确保文件末尾至少有一个换行符,然后捕获并忽略从 toMatchResult 冒出的 nullPointerException 并退出循环那个会发生。

于 2017-07-21T03:17:16.823 回答