为什么我在 findbug 中得到 Possible null pointer dereference?

Why am i getting Possible null pointer dereference in findbug?

下面代码的第 5 行被 findbugs 发现为错误:

由于调用的 return 值,com.xyz.common.CommonUtils.FolderNotEmpty(String) 中可能存在空指针取消引用 方法 [Troubling(13), Normal confidence]

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()可以returnnull。用以下代码重写它:

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

文件 class 的 listFiles 方法可以 return 为空。 所以你需要在第5行检查f.listFiles() return是否为null,否则if (f.listFiles().length > 0)会导致NPE。

您有竞争条件:

  1. 你调用 f.isDirectory(),returns 正确。
  2. 我用一些普通文件替换了 path 中的目录。
  3. 您调用 f.listFiles(),其中 returns 为空。

为避免这种情况,请无条件地说 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)。)

实际上,您的代码非常安全。

If this abstract pathname does not denote a directory, then this method returns null. Otherwise an array of File objects is returned, one for each file or directory in the directory.

这正是您所涵盖的内容。

但是,Findbugs 不知道该合同。它只是说存在 潜在 NPE。您可以选择忽略它。