[英]Why am i getting Possible null pointer dereference in findbug?
在 findbugs 發現的錯誤代碼的第 5 行:
由於調用方法的返回值,com.xyz.common.CommonUtils.FolderNotEmpty(String) 中可能的 null 指針取消引用 [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;
}
因為f.listFiles()
可以返回null
。 用以下代碼重寫它:
if (f.listFiles() != null && f.listFiles().length > 0)
你有一個競爭條件:
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)
。)
文件 class 的 listFiles 方法可以返回 null。 所以你需要檢查 f.listFiles() 是否在第 5 行返回 null,否則,如果 (f.listFiles().length > 0) 會導致 NPE。
實際上,您的代碼是完全安全的。
如果此抽象路徑名不表示目錄,則此方法返回 null。 否則返回一個 File 對象數組,一個對應於目錄中的每個文件或目錄。
這正是你所涵蓋的。
但是,Findbugs 無法知道該合同。 它只是說存在潛在的NPE。 你可以選擇忽略它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.