Метод listFiles java.io.File выдает исключение NullPointerException

Я запускал этот код, и он отлично работал в среде IDE NetBeans, но как только я создал JAR-файл и запустил его, щелкнув, произошел сбой и возникло NullPointerException

       String sepChar = File.separator;
        File homeFolder = new File(System.getProperty("user.dir"));
        File dataFolder = new File(homeFolder.getAbsolutePath() + sepChar + "Saved Images");
        System.err.println("data files is folder: "+dataFolder.isDirectory());
        System.err.println("data files is file: "+dataFolder.isFile());

        System.err.println("data files: "+dataFolder.listFiles());
        System.err.println("data folder: "+dataFolder);
        System.err.println("data folder path : "+dataFolder.getAbsolutePath());

File[]files = dataFolder.listFiles();
for(File f:files){...}

Этот код дает сбой на for(File f:files) Код обращается к папке на моем флеш-накопителе, и я проверил путь, и все в порядке.

Вывод операторов println показан ниже: Первый набор предназначен для IDE, а второй — для командной строки:

Вывод IDE:

data files is folder: true
data files is file: false
data files: [Ljava.io.File;@a298b7
data folder: F:\JambTextProject\Saved Images
data folder path : F:\JambTextProject\Saved Images

Вывод командной строки (полученный при запуске java -jar jarName.jar):

data files is folder: false
data files is file: false
data files: null
data folder: F:\JambTextProject\dist\Saved Images
data folder path : F:\JambTextProject\dist\Saved Images

Так что же это может быть? Почему код хорошо работает в среде IDE, но падает при запуске из jar-файла? На флэш-накопителе 391 МБ свободного места, а размер папки, к которой нужно получить доступ, составляет 163 МБ, а ее размер на диске составляет 292 МБ.


person gbenroscience    schedule 12.10.2015    source источник
comment
Вы должны прочитать javadoc для File.listFiles.   -  person Andy Turner    schedule 12.10.2015
comment
И это не метод listFiles, который вызывает NPE, это вы пытаетесь повторить результат в расширенном цикле for.   -  person Andy Turner    schedule 12.10.2015
comment
Вопрос не в NullPointer, вопрос в том, почему код ведет себя по разному в IDE и в командной строке   -  person gbenroscience    schedule 12.10.2015
comment
Взгляните на это: stackoverflow.com/questions/16239130/   -  person Titus    schedule 12.10.2015
comment
Спасибо, но я точно знаю, что означает user.dir, и я написал приложения, которые его используют. Или я что-то упускаю? пожалуйста, объясни?   -  person gbenroscience    schedule 12.10.2015
comment
Файл jar находится в папке dist, но ваш код из IDE выполняется непосредственно из JambTextProject, по крайней мере, так кажется из путей, которые ваша программа выводит F:\JambTextProject\Saved Images и F:\JambTextProject\dist\Saved Images   -  person Titus    schedule 12.10.2015
comment
Я тоже это обнаружил только сейчас, когда изучал вывод FIle.list(). Спасибо, Титус, это тоже решило эту проблему вместе с ответом Энди Тернера. Ваш ответ был частным ответом на более общий ответ Энди Тернера.   -  person gbenroscience    schedule 12.10.2015


Ответы (1)


Согласно javadoc File.listFiles, метод:

Возвращает null, если этот абстрактный путь не указывает на каталог или если возникает ошибка ввода-вывода.

Поэтому, когда вы пытаетесь повторить результат, он равен нулю, и возникает исключение NullPointerException.

Это означает, что ваша среда IDE настроена иначе, чем ваша командная строка, например. у него другой рабочий каталог.

person Andy Turner    schedule 12.10.2015
comment
Так почему же ошибка ввода-вывода не возникает, когда я запускаю код напрямую? почему это происходит только тогда, когда я дважды щелкаю банку или запускаю ее из командной строки. Спасибо, но я уже знаю, почему возникает NullPointerException. - person gbenroscience; 12.10.2015
comment
Собственно, IDE тоже запускает проект с той же флешки, с которой его запускает командная строка. Так могут ли рабочие каталоги отличаться в этих обстоятельствах? - person gbenroscience; 12.10.2015