15

コードに次のようなものがある場合:

String line = r.readLine();  //Where r is a bufferedReader

次の行がファイルの最後である場合、どうすればクラッシュを回避できますか? (つまり、ヌル)

対処する必要があるものがあるかもしれないので、次の行を読む必要がありますが、コードがない場合はクラッシュします。

そこに何かがあれば大丈夫ですが、そこに何かがあるとは限りません。

したがって、次のようなことをすると: (疑似コード):

if (r.readLine is null)
//End code

else {check line again and excecute code depending on what the next line is}

私がこのような問題を抱えているのは、行をnullと照合すると、すでに次の行に移動しているため、どうすれば再度確認できますか?

私はこれを行う方法を考え出していません - 何か提案があれば大変助かります。

4

7 に答える 7

5

以下を使用して、ファイルの終わりを確認できます。

public bool isEOF(BufferedReader br)  
{
     boolean result;

     try 
     {
         result = br.ready();
     } 
     catch (IOException e)
     {
         System.err.println(e);
     }
     return result;
}
于 2017-06-23T20:46:36.357 に答える
1

そもそも質問なんですが、「関数型プログラミングアプローチ」を使ってみませんか?とにかく、 Java 1.8から新しいメソッドlines()が追加され、BufferedReaderがコンテンツをStreamとして返すようになります。ファイルからすべての行をストリームとして取得し、ロジックに基づいて文字列をソートし、同じものをリスト/セットに収集して出力ファイルに書き込むことができます。同じアプローチを使用する場合、 NullPointerExceptionについて心配する必要はありません。以下は同じコードスニペットです:-

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;

public class LineOperation {
    public static void main(String[] args) throws IOException {
            Files.newBufferedReader(Paths.get("C://xyz.txt")).
            lines().
            collect(Collectors.toSet()). // You can also use list or any other Collection
            forEach(System.out::println);
    }

}
于 2018-07-23T07:48:32.873 に答える
-4

意図的にループ内でエラーをスローさせることができます。すなわち:

String s = "";
while (true) {
    try {
        s = r.readline();
    }catch(NullPointerException e) {
        r.close();
        break;
    }
    //Do stuff with line
}

他の誰もが悲しんでいることもうまくいくはずです。

于 2013-07-16T14:20:09.333 に答える