【问题标题】:Why am i getting Possible null pointer dereference in findbug?为什么我在 findbug 中得到可能的空指针取消引用?
【发布时间】:2020-05-05 19:49:14
【问题描述】:

以下代码的第 5 行被 findbugs 发现为一个错误:

由于调用的返回值,com.xyz.common.CommonUtils.FolderNotEmpty(String) 中可能存在空指针取消引用 方法[麻烦(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;
    }

【问题讨论】:

    标签: java findbugs


    【解决方案1】:

    你有一个竞争条件:

    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)。)

    【讨论】:

      【解决方案2】:

      因为f.listFiles() 可以返回null。改写如下代码:

      if (f.listFiles() != null && f.listFiles().length > 0)
      

      【讨论】:

      • 基本正确。但是我认为f.isDirectory() 为真时listFiles() 不会返回null
      • @OleV.V.这是正确的,但至少存在一个竞争条件,即f 可以在isDirectory()listFiles() 调用之间被替换。 (就像这里有一个竞争条件,可能是一个严重的性能问题。)
      • 由于f 是一个局部变量,所以不能存在竞争条件。
      • @DorianGray f与文件系统上的文件相对应的路径名。该文件可以随时更改。
      • 谢谢,但我尝试使用相同的代码仍然显示相同的内容。
      【解决方案3】:

      File 类的listFiles 方法可以返回null。 所以你需要检查 f.listFiles() 是否在第 5 行返回 null,否则 if (f.listFiles().length > 0) 会导致 NPE。

      【讨论】:

        【解决方案4】:

        实际上,您的代码是完全安全的。

        如果此抽象路径名不表示目录,则此方法返回 null。否则返回一个 File 对象数组,一个对应于目录中的每个文件或目录。

        这正是您所涵盖的内容。

        但是,Findbugs 无法知道该合同。它只是说有一个潜在 NPE。你可以选择忽略它。

        【讨论】:

        • 这是不正确的,正如接受的答案所解释的那样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 2016-09-14
        • 2011-05-27
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        相关资源
        最近更新 更多