Java SonarQube显示可能的空指针解引用

Java SonarQube显示可能的空指针解引用,java,null,sonarqube,nullreferenceexception,Java,Null,Sonarqube,Nullreferenceexception,此代码中可能存在空指针取消引用错误: if(!Util.isNull(dir)){ if (dir.isDirectory()){ if(!Util.isNull(dir.list())) if((!Util.isNull(dir.list().length))) // issue reported here if(dir.list().length == 0) // another issue reported h

此代码中可能存在空指针取消引用错误:

if(!Util.isNull(dir)){
    if (dir.isDirectory()){
        if(!Util.isNull(dir.list()))
            if((!Util.isNull(dir.list().length))) // issue reported here
                if(dir.list().length == 0) // another issue reported here
                    if (dir.delete())
                        LOGGER.info("deleted:");
                    }
                }

如何解决这些问题?

请检查
dir.list()
是否为空。然后,您对
dir.list()
执行其他调用,并假设在本例中该值不能为null

SonarJava试图告诉您,尽管
dir.list()
一开始并不是空的,但第二次/第三次调用可能会变成空的

要解决这个问题:

  • dir.list()
    的结果保存在变量中
  • 检查变量是否不为null
  • 使用变量

  • 这也被称为提取变量重构,它具有额外的良好效果。如果您不希望调用之间更改
    dir.list()
    的结果,那么您也将提高性能,因为程序不需要再次访问文件系统来生成目录的内容。

    Sonar的可能副本知道我的应用程序中其他文件中的Util.isNull。我要指出的是:假设
    dir
    文件,
    dir.list()。length
    从不为null,它是
    int
    。类似地,如果
    dir.isDirectory()
    ,则
    dir.list()
    不为空。我尝试了许多考虑,因此最终添加了dir.list()。length.Will将被删除it@vk1服务器上安装的SonarJava版本是什么?Util类的包名是什么?目录的类型是什么?如何将该值传递给这段代码(它是本地变量还是方法参数?)?请提供所有相关信息,以便任何人能够帮助您。@vk1酷!谢谢你的反馈!考虑将其标记为“接受”(绿色蜱图标)。这将给你2个信誉点(是的)和我15个信誉点(是的!),并立即向所有其他读者表明,这解决了你的问题。您甚至可以删除您的评论(因为它将被废弃)。