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))
永远不会失败,即使 line
是 null
。它通常也更具可读性,因为您经常想知道您在比较什么;您要检查的变量较少 "informative".
我在我的项目中添加了 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))
永远不会失败,即使 line
是 null
。它通常也更具可读性,因为您经常想知道您在比较什么;您要检查的变量较少 "informative".