O método BufferedReader.ready () garante que o método readLine () não retorne NULL?
Eu tenho esse código para ler um arquivo de texto usandoBufferedReader
:
BufferedReader reader=null;
try {
reader = new BufferedReader(new FileReader("file1.txt"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
Funciona corretamente, mas o Findbugs relata um aviso:
NP_DEREFERENCE_OF_READLINE_VALUE: O resultado da chamada de readLine () é desreferenciado sem verificar se o resultado é nulo. Se não houver mais linhas de texto para ler, readLine () retornará nulo e desreferenciamento que gerarão uma exceção de ponteiro nulo.
Quando eu mudoFileReader
paraStringReader
, ou seja,
BufferedReader reader=null;
try {
reader = new BufferedReader(new StringReader("ABCD"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
areadLine
método retornanull
enquanto oready
método sempre retornatrue
- de fato, este é um loop infinito.
Parece que oreadLine
pode retornarnull
mesmo seready
retornatrue
. Mas por que o comportamento difere para diferentesReader
s?
ATUALIZAR:
Eu sei a maneira normal de ler um arquivo de texto (exatamente como Peter e Ali ilustraram). mas li esse pedaço de código do meu colega e percebi que não conhecia oready
método. Então eu li o JavaDoc, mas não entendoblock
. Então eu fiz um teste e postei esta pergunta. Portanto, a melhor maneira de fazer essa pergunta pode ser:
Quando a entrada estará bloqueando? Como usar oready
método (ou por que não usá-lo)? Por que aqueles 2Reader
s (FileReader
eStringReader
) se comportam de maneira diferente em relação aoready
método?