getTextContent() 通过 "Null pointers should not be dereferenced"

getTextContent() through "Null pointers should not be dereferenced"

我有一个下面的方法,我们使用“getTextContent()”来获取当前节点的文本内容。

if (getElement(Details, null, "AMB") != null) {
            payload.put("<String>",
                    getElement(Details, null, "AMB").getTextContent().trim());
        }
        

我总是收到 sonarqube 错误“不应取消引用空指针”获取​​ emement 方法如下

private Element getElement(Node node, String errMessage, String... paths) {
        NodeList nodeList;
        Element element = (Element) node;
        for (String path : paths) {
            nodeList = element.getElementsByTagNameNS("*", path);
            if (checkList(nodeList)) {
                element = (Element) nodeList.item(0);
            } else {
                if (errMessage != null) {
                    log.error("Unable to read node element {}", errMessage);
                }
                return null;
            }
        }
        return element;
    }

我不确定如何处理这种情况。我试图在 if 条件中加入另一个“if”。但是再次通过更多错误声纳 qube

你能帮我解决一个问题吗?

我想,您有一个像 getElement(Details, null, "AMB") != null 这样的条件这一事实向代码审计工具提示方法 getElement 可能 return null。在那种情况下,调用方法的实际实现代码是不相关的。

因此,该工具会产生警告,因为随后的 getElement(Details, null, "AMB").getTextContent().trim() 在没有 null 检查的情况下取消引用对 getElement 的调用结果。

您似乎假设 getElement(Details, null, "AMB") 的两次后续调用将 return 相同的结果,因此,前面的测试就足够了,但代码审计工具通常不会做出这样的假设。

解决此问题的最简单方法是使用局部变量来保存结果,这通常优于重复表达式。

Element e = getElement(Details, null, "AMB");
if(e != null) {
    payload.put("<String>", e.getTextContent().trim());
}

这应该足以让任何代码检查工具相信条件和后续使用指的是相同的值,因此,e 不能 nulle.getTextContent()调用。