Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我会在findbug中得到可能的空指针解引用?_Java_Findbugs - Fatal编程技术网

Java 为什么我会在findbug中得到可能的空指针解引用?

Java 为什么我会在findbug中得到可能的空指针解引用?,java,findbugs,Java,Findbugs,在下面代码的第5行,findbugs发现了一个bug: 由于调用的返回值,com.xyz.common.CommonUtils.FolderNotEmpty(字符串)中可能存在空指针取消引用 方法[令人不安(13),正常置信度] public static boolean FolderNotEmpty(String path) { boolean flag = false; File f = new File(path); if (f.isDire

在下面代码的第5行,findbugs发现了一个bug:

由于调用的返回值,com.xyz.common.CommonUtils.FolderNotEmpty(字符串)中可能存在空指针取消引用 方法[令人不安(13),正常置信度]

public static boolean FolderNotEmpty(String path) {
        boolean flag = false;
        File f = new File(path);
        if (f.isDirectory()) {
            if (f.listFiles().length > 0) {
                flag = true;
                LOGGER.info("Folder - " + path + " is not empty.");
            } else {
                LOGGER.info("Folder - " + path + " is empty.");
            }
        } else {
            LOGGER.warn("The given path is not a directory - " + path);
        }
        return flag;
    }
因为
f.listFiles()
可以返回
null
。用以下代码重写它:

if (f.listFiles() != null && f.listFiles().length > 0)

File类的listFiles方法可以返回null。
因此,您需要检查f.listFiles()是否在第5行返回null,否则,如果(f.listFiles().length>0)会导致NPE。

您有一个竞争条件:

  • 调用
    f.isDirectory()
    ,返回true
  • 我用一些普通文件替换
    path
    处的目录
  • 调用
    f.listFiles()
    ,它返回null
  • 要避免这种情况,请说
    File[]files=f.listFiles()无条件,然后将
    if
    更改为
    if(files!=null)
    。更好的是,通过以下方式减少方法中的嵌套:

    public static boolean folderIsNotEmpty(String path) {
        File f = new File(path);
        File[] files = f.listFiles();
    
        if (files == null) {
            logger.warn("not a directory");
            return false;
        }
    
        if (files.length > 0) { 
            logger.info("not empty");
            return true;
        } else {
            logger.info("empty");
            return false;
        }
    }
    

    (或者,如果您不需要日志语句,
    return(files.length>0)

    实际上,您的代码是完全安全的

    如果此抽象路径名不表示目录,则此方法返回null。否则将返回一个文件对象数组,每个文件或目录对应一个

    这正是你所涵盖的内容


    但是,Findbugs无法了解该合同。它只是说有一个潜在的NPE。你可以选择忽略这一点。

    这基本上是正确的。但是我认为当
    f.isDirectory()
    为true时,
    listFiles()
    不会返回
    null
    。这是正确的,但至少在
    isDirectory()
    listFiles()。(就像这里有竞争条件一样,这可能会导致严重的性能问题。)因为
    f
    是一个局部变量,所以不能有竞争条件。@DorianGray
    f
    是与文件系统上的文件相对应的路径名。该文件可以随时更改。谢谢,但我尝试使用相同的代码,但其显示的内容仍然相同。正如公认的答案所解释的,这是不正确的。