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

时间:2011-07-27 19:52:17

标签: java findbugs pmd

代码审核工具抱怨 saveSafeScan中可能的空指针取消引用safeScanWarning(...) 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++;
            }
        }
    }

3 个答案:

答案 0 :(得分:10)

如果它真的指向那一行,对我来说,它看起来像代码审查工具中的一个错误。

因为它是一个局部变量,所以在无效性检查和size()调用之间不可能被其他任何东西改变 - 所以它不会抛出NullPointerException。< / p>

答案 1 :(得分:0)

有一个语句分支,如果执行,则保证将取消引用null值,这将在执行代码时生成NullPointerException。当然,问题可能是分支或语句不可行,并且NullPointerException不能被抛出。决定超出FindBugs的能力。

答案 2 :(得分:0)

属性“dtec”应该得到证实:

    if (null!=dtec && null!=safeScanWarnings && safeScanWarnings.size()>0)
    {
      Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();