为什么我在findbug中可能得到空指针取消引用?

时间:2020-05-05 19:49:14

标签: java findbugs

在以下代码的第5行,被findbugs发现为错误:

由于被调用的返回值,可能在com.xyz.common.CommonUtils.FolderNotEmpty(String)中取消空指针的引用 方法[Troubling(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;
    }

4 个答案:

答案 0 :(得分:1)

因为f.listFiles()可以返回null。用以下代码重写它:

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

答案 1 :(得分:1)

您有比赛条件:

  1. 您致电f.isDirectory(),该电话返回true。
  2. 我用一些普通文件替换了path上的目录。
  3. 您致电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)。)

答案 2 :(得分:0)

File类的

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

答案 3 :(得分:0)

实际上,您的代码是绝对安全的。

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

这正是您所涵盖的内容。

但是,Findbugs无法得知该合同。它只是说有一个潜在 NPE。您可以选择忽略它。