【问题标题】:Explanation and fix for Possible null pointer dereference of可能的空指针解引用的解释和修复
【发布时间】:2011-07-27 19:52:16
【问题描述】:

代码审查工具抱怨 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++;
            }
        }
    }

【问题讨论】:

  • 虽然在您的示例中,代码在您的错误中是正确的,但 if 有 &amp; 而没有 &amp;&amp;。因此,请确保在实际代码中它是短路评估。如果已经是这种情况,那就是工具中的一个错误。
  • 请注意您在代码示例上方的评论是if (safeScanWarnings != null &amp; safeScanWarnings.size() &gt; 0),这是错误的(错误)

标签: java findbugs pmd


【解决方案1】:

如果它真的指向那条线,在我看来,它就像代码审查工具中的一个错误。

由于它是一个局部变量,它不可能被空值检查和 size() 调用之间的任何其他东西改变 - 所以它不可能抛出 NullPointerException

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      属性“dtec”应该是安全的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多