簡體   English   中英

為什么我在 findbug 中得到可能的 null 指針取消引用?

[英]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)

你有一個競爭條件:

  1. 您調用f.isDirectory() ,它返回 true。
  2. 我用一些普通文件替換path中的目錄。
  3. 您調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM