Findbugs - 在读取输入流时处理空值检查和编码

Findbugs - handling null check and encoding in reading input stream

我在我的项目中添加了 Findbugs 插件,但突然出现以下错误:Dereference of the result of readLine() without nullcheck

我有以下逐行读取 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;
}

但这会永远卡住(因此无法正确重写)。对于这样一个基本问题,我很抱歉,但我似乎无法正确回答...

另一个被标记为错误的是Found reliance on default encoding in ..InputStream...

如何在 InputStreamReader 中指定编码?

貌似readLine可以returnnull,所以你要在line = in.readLine();

之后检查一下

如果 readLine returned null.

,您更新后的代码仍可能抛出 NullPointerException

我怀疑您的更改是否有效,因为正在对行的 previous 值进行检查,因此,如果您的上一行有效(但您在哪里阅读最后一行)任何后续调用都可能产生 NullPointerException.

解决这个问题,通常应用以下模式:

InputStream input = clientSocket.getInputStream();

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

固定循环如下所示:

InputStream input = clientSocket.getInputStream();

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

为什么?首先,远端(客户端)关闭连接,readLine()将returnnull。这就是外部检查所防范的。

如果客户端只是停止发送数据,

readLine() 根本不会 return。因此,只要客户端保持连接打开,您的 "fixed" 循环就会挂起。

比较字符串文字时,我总是把它们放在第一位:

"".equals(line))

永远不会失败,即使 linenull。它通常也更具可读性,因为您经常想知道您在比较什么;您要检查的变量较少 "informative".