我在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)有人知道是什么导致了这个异常吗?
发布于 2012-03-08 18:21:00
GCJ Home Page建议它“支持1.4个库中的大多数,外加大约1.5个附加库”。
Scanner是在1.5版本中添加的,我怀疑您使用的是GCJ不支持的功能。你需要尝试一些不同的东西,看看你能得到什么。
您不使用OpenJDK/Oracle Java 6或7有什么原因吗?(请不要说是因为性能原因;)
发布于 2017-07-21 11:17:17
我重现了这个错误,并找到了一个解决的方法
以下是在Java /Linux,Fedora和x86_64 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中的一个bug,完全合法的ascii输入以及空字符串会导致它在文件的最后一行创建一个NPE。
解决方法
由于此错误只发生在文件的最后一行,因此棘手的解决方法是首先确保文件末尾至少有一个换行符,然后捕获并忽略从toMatchResult中冒出的nullPointerException,并在发生这种情况时退出循环。
https://stackoverflow.com/questions/9615814
复制相似问题