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

问题描述 投票:0回答:1

在下面代码的第5行,被findbugs发现为一个bug。

Possible null pointer dereference in com.xyz.common.CommonUtils.FolderNotEmpty(String) due to return value of called method [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;
    }
java findbugs
1个回答
1
投票

你有一个竞赛条件。

  1. 你调用了 f.isDirectory(),返回true。
  2. 我将目录替换为 path 用一些普通的文件。
  3. 你调用 f.listFiles(),返回null。

为了避免这种情况,比如说 File[] files = f.listFiles(); 无条件的,然后改变你的 ifif (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).)


1
投票

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

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

0
投票

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


0
投票

其实,你的代码是完全安全的。

如果这个抽象路径名不表示一个目录,那么这个方法返回null。否则会返回一个File对象数组,目录中的每个文件或目录都有一个。

这正是你所涵盖的内容。

然而,Findbugs不能知道这个合同。它只是说有一个 潜在 NPE。你可以选择忽略。

© www.soinside.com 2019 - 2024. All rights reserved.