在以下代码的第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;
}
答案 0 :(得分:1)
因为f.listFiles()
可以返回null
。用以下代码重写它:
if (f.listFiles() != null && f.listFiles().length > 0)
答案 1 :(得分:1)
您有比赛条件:
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)
。)
答案 2 :(得分:0)
listFiles方法可以返回null。 因此,您需要检查f.listFiles()在第5行是否返回null,否则(f.listFiles()。length> 0)是否会导致NPE。
答案 3 :(得分:0)
实际上,您的代码是绝对安全的。
如果此抽象路径名不表示目录,则此方法返回null。否则,将返回File对象的数组,该对象对应目录中的每个文件或目录。
这正是您所涵盖的内容。
但是,Findbugs无法得知该合同。它只是说有一个潜在 NPE。您可以选择忽略它。