Java 可能的空指针解引用的解释和修复
代码审阅工具正在抱怨saveSafeScan(…)中的safeScanWarnings在行if(safeScanWarnings!=null&safeScanWarnings.size()>0)中可能存在空指针取消引用 我想知道这怎么可能?这是因为我们通过引用返回集合吗Java 可能的空指针解引用的解释和修复,java,findbugs,pmd,Java,Findbugs,Pmd,代码审阅工具正在抱怨saveSafeScan(…)中的safeScanWarnings在行if(safeScanWarnings!=null&safeScanWarnings.size()>0)中可能存在空指针取消引用 我想知道这怎么可能?这是因为我们通过引用返回集合吗 protected void saveSafeScan(final Response response, final Dtec dtec) throws dtecException { Collectio
protected void saveSafeScan(final Response response, final Dtec dtec) throws dtecException
{
Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();
if (safeScanWarnings!=null && safeScanWarnings.size()>0)
{
Iterator<String> iterator = safeScanWarnings.iterator();
int i = 0;
while (iterator.hasNext())
{
String safeScanCode = iterator.next();
if (i == 0)
{
response.setSafeScanCode(safeScanCode);
response.setSafeScanCodeText(getMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s",
StringUtils.trimToEmpty(safeScanCode))));
}
SafeScanWarning safeScan = new SafeScanWarning();
safeScan.setCode(safeScanCode);
safeScan.setMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", StringUtils.trimToEmpty(safeScanCode)));
safeScan.setPriority(i);
response.getSafeScanWarnings().add(safeScan);
i++;
}
}
}
protectedvoid saveSafeScan(最终响应,最终Dtec Dtec)抛出dtecException
{
集合safeScanWarnings=dtec.getSafeScanWarnings();
if(safeScanWarnings!=null&&safeScanWarnings.size()>0)
{
迭代器迭代器=安全扫描警告。迭代器();
int i=0;
while(iterator.hasNext())
{
字符串safeScanCode=iterator.next();
如果(i==0)
{
响应。设置安全扫描代码(安全扫描代码);
response.setSafeScanCodeText(getMessage(String.format)(“DTECRESPONSE\u SAFESCANCODE\u%s”,
StringUtils.trimToEmpty(安全扫描码));
}
SafeScanWarning safeScan=新的SafeScanWarning();
safeScan.setCode(safeScanCode);
safeScan.setMessage(String.format(“DTECRESPONSE_SAFESCANCODE_uu%s”,StringUtils.trimToEmpty(SAFESCANCODE)));
安全扫描。设置优先级(i);
response.getSafeScanWarnings().add(safeScan);
i++;
}
}
}
如果它真的指向那一行,在我看来它就像是代码审查工具中的一个bug
由于它是一个局部变量,在空性检查和
size()
调用之间,它不可能被其他任何东西更改-因此它不可能抛出NullPointerException
有一个语句分支,如果执行该分支,将保证null
值将被取消引用,这将在执行代码时生成NullPointerException
。当然,问题可能是分支或语句不可行,并且永远无法抛出NullPointerException
。确定这超出了FindBugs
的能力 属性“dtec”应安全化:
if (null!=dtec && null!=safeScanWarnings && safeScanWarnings.size()>0)
{
Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();
if(null!=dtec&&null!=safeScanWarnings&&safeScanWarnings.size()>0)
{
集合safeScanWarnings=dtec.getSafeScanWarnings();
在您的示例中,代码在您的错误中是正确的,if有一个&
而没有&
。因此,请确保在实际代码中是短路评估。如果已经是这种情况,则是工具中的错误。请注意,代码示例上方的注释是if(safeScanWarnings!=null&safeScanWarnings.size()>0)
哪个是错误的(buggy)