1

java5でスキャナークラスを使用していますが、次のコードで例外がスローされます。

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の追加をサポートしている」と示唆しています。

スキャナーはバージョン1.5で追加されましたが、GCJがサポートしていない機能の一部にヒットしたと思われます。何ができるかを確認するには、別のことを試す必要があります。

OpenJDK / Oracle Java 6または7を使用していない理由はありますか?(パフォーマンス上の理由から、言わないでください;)

于 2012-03-08T10:20:59.797 に答える
0

エラーを再現し、回避策を見つけました

x86_64 GNU / Linux、Java1.5.0を使用したFedoraでコンパイルされたコードは次のとおりです。

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
}

このファイルには、改行で区切られた2つの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が挿入されます。

回避策

このバグはファイルの最後の行でのみ発生するため、ハッキーな回避策は、最初にファイルの最後に少なくとも1つの改行があることを確認してから、toMatchResultからバブルアップしたnullPointerExceptionをキャッチして無視し、次の場合にループを終了することです。発生します。

于 2017-07-21T03:17:16.823 に答える