Java 为什么我会在findbug中得到可能的空指针解引用?
在下面代码的第5行,findbugs发现了一个bug: 由于调用的返回值,com.xyz.common.CommonUtils.FolderNotEmpty(字符串)中可能存在空指针取消引用 方法[令人不安(13),正常置信度]Java 为什么我会在findbug中得到可能的空指针解引用?,java,findbugs,Java,Findbugs,在下面代码的第5行,findbugs发现了一个bug: 由于调用的返回值,com.xyz.common.CommonUtils.FolderNotEmpty(字符串)中可能存在空指针取消引用 方法[令人不安(13),正常置信度] public static boolean FolderNotEmpty(String path) { boolean flag = false; File f = new File(path); if (f.isDire
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)
File类的listFiles方法可以返回null。
因此,您需要检查f.listFiles()是否在第5行返回null,否则,如果(f.listFiles().length>0)会导致NPE。您有一个竞争条件:
f.isDirectory()
,返回truepath
处的目录f.listFiles()
,它返回nullFile[]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)
)实际上,您的代码是完全安全的
如果此抽象路径名不表示目录,则此方法返回null。否则将返回一个文件对象数组,每个文件或目录对应一个
这正是你所涵盖的内容
但是,Findbugs无法了解该合同。它只是说有一个潜在的NPE。你可以选择忽略这一点。这基本上是正确的。但是我认为当f.isDirectory()
为true时,listFiles()
不会返回null
。这是正确的,但至少在isDirectory()
和listFiles()。(就像这里有竞争条件一样,这可能会导致严重的性能问题。)因为f
是一个局部变量,所以不能有竞争条件。@DorianGrayf
是与文件系统上的文件相对应的路径名。该文件可以随时更改。谢谢,但我尝试使用相同的代码,但其显示的内容仍然相同。正如公认的答案所解释的,这是不正确的。