Почему я получаю сообщение о возможном разыменовании нулевого указателя в findbug? - PullRequest
1 голос
/ 05 мая 2020

В 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;
    }

Ответы [ 4 ]

1 голос
/ 05 мая 2020

У вас есть состояние гонки:

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

1 голос
/ 05 мая 2020

Потому что f.listFiles() может вернуть null. Перепишите его следующим кодом:

if (f.listFiles() != null && f.listFiles().length > 0)
0 голосов
/ 05 мая 2020

На самом деле ваш код совершенно безопасен.

Если этот абстрактный путь не обозначает каталог, то этот метод возвращает null. В противном случае возвращается массив объектов File, по одному для каждого файла или каталога в каталоге.

Это именно то, что вы рассказали.

Однако Findbugs не может знать об этом контракте. Он просто говорит, что существует потенциал NPE. Вы можете проигнорировать это.

0 голосов
/ 05 мая 2020

Метод listFiles класса File может возвращать значение null. Поэтому вам нужно проверить, возвращает ли f.listFiles () значение null в 5-й строке, иначе if (f.listFiles (). Length> 0) может вызвать NPE.

...