2015-04-27 2 views
2

Я добавил FindBugs плагин для моего проекта, и я вдруг начал получать следующую ошибку: Dereference of the result of readLine() without nullcheckFindBugs - обработка нулевой чек и кодирования при чтении входного потока

У меня есть следующий код, который считывает запрос HTTP построчно:

InputStream input = clientSocket.getInputStream(); 

String line; 
while (!(line = in.readLine()).equals("")) { 
... 
} 

Я пытался переписывать это в какой-то другой для с nullcheck:

String line = ""; 
while (line != null) { 
    line = in.readLine(); 

    if (line.equals("")) return; 
} 

Но это застревает навсегда (так что не переписан гр orrectly). Я извиняюсь за такой основной вопрос, но я не могу показаться, чтобы получить это право ...

Другое дело, что помечено как ошибка является Found reliance on default encoding in ..InputStream...

Как я могу указать кодировку в InputStreamReader?

+2

есть ли конкретная причина, по которой вы возвращаетесь с пустой строкой? просто пытаясь разобрать заголовки http? readLine() вернет null, а не пустую строку, когда заканчивается вход –

ответ

2

Фиксированный цикл выглядит так:

InputStream input = clientSocket.getInputStream(); 

String line; 
while (null != (line = in.readLine())) { 
    if("".equals(line)) break; 
    ... 
} 

Почему? Прежде всего, удаленная сторона (клиент) закрывает соединение, readLine() вернет null. То, что нарушает внешняя проверка.

readLine() не будет вообще возвращаться, если клиент просто прекратит отправку данных. Таким образом, пока клиент держит соединение открытым, ваш «фиксированный» цикл зависает.

При сравнении строковых литералов, я всегда ставлю их первым:

"".equals(line)) 

никогда не выходит из строя, даже если line является null. Это также часто более читаемо, так как вы часто хотите знать, с чем вы сравниваете; переменная, которую вы хотите проверить, менее информативна.

+0

Спасибо, это работает, в отличие от других обходных решений) – Smajl

0

Видимо readLine может вернуться null, так что вы должны проверить его после line = in.readLine();

Вашего обновленного кода все еще может бросить NullPointerException, если readLine вернулся null.

0

Я сомневаюсь, что ваши изменения будут работать, так как проверка производится на предыдущем значение строки, таким образом, если ваша предыдущая строка была действительной (но вы, где читаете последнюю строку), любые последующие вызовы могут потенциально a NullPointerException.

ходу вокруг этого, как правило, следующий шаблон применяется:

InputStream input = clientSocket.getInputStream(); 

String line = ""; 
while ((line = in.readLine()) != null) { 
    ... 
} 
+0

Строка 'String line =" ";' не выглядит хорошо для меня. Я предпочитаю 'String line', потому что пустая строка нигде не используется. – michaldo

+0

@michaldo: Проблема с вашим подходом заключается в том, что выполнение 'String line;' потенциально может привести к тому, что NullPointerExcetpions будет дальше по строке, если вы будете выполнять операции над строкой. Назначение его пустым - это один из способов обойти эту проблему. – npinti