Java 可能的空指针解引用的解释和修复

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

代码审阅工具正在抱怨saveSafeScan(…)中的safeScanWarnings在行if(safeScanWarnings!=null&safeScanWarnings.size()>0)中可能存在空指针取消引用

我想知道这怎么可能?这是因为我们通过引用返回集合吗

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)