在下面代码的第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;
}
你有一个竞赛条件。
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)
.)
因为 f.listFiles()
可以返回 null
. 用下面的代码重写它。
if (f.listFiles() != null && f.listFiles().length > 0)
File类中的listFiles方法可以返回null,所以需要检查f.listFiles()是否在第5行返回null,否则,如果(f.listFiles().length > 0)会导致NPE。所以你需要在第5行检查f.listFiles()是否返回null,否则,如果(f.listFiles().length > 0)会导致NPE。
其实,你的代码是完全安全的。
如果这个抽象路径名不表示一个目录,那么这个方法返回null。否则会返回一个File对象数组,目录中的每个文件或目录都有一个。
这正是你所涵盖的内容。
然而,Findbugs不能知道这个合同。它只是说有一个 潜在 NPE。你可以选择忽略。