繁体   English   中英

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

[英]Why am i getting Possible null pointer dereference in findbug?

在 findbugs 发现的错误代码的第 5 行:

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

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

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

你有一个竞争条件:

  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) 。)

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

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

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

这正是你所涵盖的。

但是,Findbugs 无法知道该合同。 它只是说存在潜在的NPE。 你可以选择忽略它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM