为什么我在 findbug 中得到 Possible null pointer dereference?
Why am i getting Possible null pointer dereference in findbug?
下面代码的第 5 行被 findbugs 发现为错误:
由于调用的 return 值,com.xyz.common.CommonUtils.FolderNotEmpty(String) 中可能存在空指针取消引用
方法 [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.listFiles()
可以returnnull
。用以下代码重写它:
if (f.listFiles() != null && f.listFiles().length > 0)
文件 class 的 listFiles 方法可以 return 为空。
所以你需要在第5行检查f.listFiles() return是否为null,否则if (f.listFiles().length > 0)会导致NPE。
您有竞争条件:
- 你调用
f.isDirectory()
,returns 正确。
- 我用一些普通文件替换了
path
中的目录。
- 您调用
f.listFiles()
,其中 returns 为空。
为避免这种情况,请无条件地说 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)
。)
实际上,您的代码非常安全。
If this abstract pathname does not denote a directory, then this method returns null. Otherwise an array of File objects is returned, one for each file or directory in the directory.
这正是您所涵盖的内容。
但是,Findbugs 不知道该合同。它只是说存在 潜在 NPE。您可以选择忽略它。
下面代码的第 5 行被 findbugs 发现为错误:
由于调用的 return 值,com.xyz.common.CommonUtils.FolderNotEmpty(String) 中可能存在空指针取消引用 方法 [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.listFiles()
可以returnnull
。用以下代码重写它:
if (f.listFiles() != null && f.listFiles().length > 0)
文件 class 的 listFiles 方法可以 return 为空。 所以你需要在第5行检查f.listFiles() return是否为null,否则if (f.listFiles().length > 0)会导致NPE。
您有竞争条件:
- 你调用
f.isDirectory()
,returns 正确。 - 我用一些普通文件替换了
path
中的目录。 - 您调用
f.listFiles()
,其中 returns 为空。
为避免这种情况,请无条件地说 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)
。)
实际上,您的代码非常安全。
If this abstract pathname does not denote a directory, then this method returns null. Otherwise an array of File objects is returned, one for each file or directory in the directory.
这正是您所涵盖的内容。
但是,Findbugs 不知道该合同。它只是说存在 潜在 NPE。您可以选择忽略它。