我在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)
有人知道造成这种异常的原因吗?
答案 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并退出发生这种情况时的循环。