Что вы хотите сделать, это:
я есть такой код для чтения текстового файла с помощьюBufferedReader
:
BufferedReader reader=null;
try {
reader = new BufferedReader(new FileReader("file1.txt"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
Он работает правильно, но Findbugs выдает предупреждение:
NP_DEREFERENCE_OF_READLINE_VALUE: результат вызова readLine () разыменовывается без проверки, чтобы видеть, является ли результат нулевым. Если больше нет строк текста для чтения, readLine () вернет значение null и разыменование, которое сгенерирует исключение нулевого указателя.
Когда я меняюFileReader
вStringReader
т.е.
BufferedReader reader=null;
try {
reader = new BufferedReader(new StringReader("ABCD"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
readLine
метод возвращаетnull
в то время какready
метод всегда возвращаетtrue
- Действительно, это бесконечный цикл.
Кажется, чтоreadLine
может вернутьсяnull
даже еслиready
возвращаетсяtrue
, Но почему поведение отличается для разныхReader
s?
ОБНОВИТЬ:
Я знаю нормальный способ чтения текстового файла (как иллюстрировали Питер и Али). но я прочитал этот кусок кода от моего коллеги и понял, что я не знаюready
метод. Затем я читаю JavaDoc, но не понимаюblock
, Затем я сделал тест и разместил этот вопрос. Итак, лучший способ поставить этот вопрос может быть:
Когда вход будет блокироваться? Как использоватьready
метод (или почему бы не использовать его)? Почему те 2Reader
с (FileReader
а такжеStringReader
) ведут себя по-разному в отношенииready
метод?