Java5中的Scanner类抛出java.lang.NullPointerException

时间:2012-03-08 10:04:15

标签: java java.util.scanner gcj

我在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)

有人知道造成这种异常的原因吗?

2 个答案:

答案 0 :(得分:2)

GCJ Home Page表示它“支持大多数1.4库以及1.5个新增内容。”

1.5版中添加了扫描仪,我怀疑你已经完成了GCJ不支持的一项功能。你需要尝试不同的东西才能看到你可以开始工作的东西。

您是否有任何理由不使用OpenJDK / Oracle Java 6或7? (出于性能原因,请不要说出来;)

答案 1 :(得分:0)

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

以下是在x86_64 GNU / Linux,Fedora with 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输入以及blankstring导致它在文件的最后一行呕吐NPE。

解决方法

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