1

NoSuchElementException が発生する理由がわかりません。私が読んでいるファイルは LF で終了しており、このコードは本番環境で 1 年間実行されています。私の同僚は、デバッグの過程で、ファイルが LF で終わり、正確に 1025 文字の長さである場合にエラーを再現できることを発見しました (元のファイルの長さは 10132 文字ですが)。このエラーは Linux と Windows の両方で再現可能で、JDK 1.6.0_30、JRE 1.7、および JDK 1.7.0_07 を試しました。パターンを「~$?」に変更すると または「~\r?\n?」エラーはなくなりました。

public static void main(String[] args) throws FileNotFoundException {
    String filepath = "file.txt";               
    Scanner s = null;
    try {
        s = new Scanner(new File(filepath));
        s.useDelimiter(Pattern.compile("~\n?", Pattern.UNIX_LINES));
        while (s.hasNext()) {
            System.out.println(s.next());
        }

    } finally {
        if (s != null)
            s.close();
    }
}

任意の提案をいただければ幸いです。

ありがとうございました!

編集 1 Scanner
の GNU Classpath 実装を試してみましたが、そのバージョンの Scanner は問題なく動作します。

4

1 に答える 1

1

したがって、これを締めくくるだけです...スキャナーパターンがオプションの改行で終わる場合\n? NoSuchElementException が発生する可能性があります。問題は Scanner の実装にありますが、簡単な回避策があります。

  • 行をスキャンし、正規表現なしで正規表現を適用します\n?
  • (?:\r?\n?);でスキャンを終了します。これは、スキャナがフリンジ ケースをスキップしてバッファ内のより多くの文字をプルするように強制するため、機能します。
  • scan $?あなたの;を終了します。これは行末を検出しますが、キャレットの改行/改行は選択しません。
于 2013-06-16T22:11:10.880 に答える