2013-04-29 7 views
4

У меня есть очень простой метод, который сканирует структуру каталогов для выполнения проверки. Сканирование выглядит следующим образом:java.lang.NullPointerException при сканировании каталогов

File file = new File(initpath); 

for(File hex : file.listFiles(new HexagonNameFilter())) { 

    for(File wall : hex.listFiles()) { 

     for(File shelf : wall.listFiles()) { 

      for(File book : shelf.listFiles()) { 

       // Perform some actual work 
      } 
     } 
    } 
} 

Метод называется много раз во время выполнения программы.

Непосредственно (что означает, в какой-то непредсказуемой точке процесса сканирования), я получаю java.lang.NullPointerException с трассировкой стека, указывающей на один из операторов for (какой из них также является непоследовательным). Это не поучительно. Я думал о передаче FilenameFilters в три вызова listFiles(), но не могу понять, как это поможет.

+1

Плохие новости: 'listFiles' может возвращать null: так что вам нужна переменная' File [] 'и оператор if. Или сделайте wrap listFiles в вашей собственной функции. –

+0

http://stackoverflow.com/questions/6077909/is-there-a-way-to-avoid-null-check-before-the-for-each-loop-iteration-starts – ykaganovich

ответ

3

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

listFiles

общественного файла [] listFiles()

Возвращает массив абстрактных путей, обозначающих файлы в каталоге, обозначенном этим абстрактным путем.

Если этот абстрактный путь не обозначает каталог, то этот метод возвращает нулевое. В противном случае возвращается массив объектов File, по одному для каждого файла или каталога в каталоге. Имена путей, обозначающие , сами каталог и родительский каталог этого каталога не включены в результат . Каждый результирующий абстрактный путь - , построенный из этого абстрактного пути, с помощью конструктора File (File, String) . Поэтому, если этот путь является абсолютным, то каждый результирующий путь является абсолютным; если этот путь является относительным, то каждый возвращаемый путь будет иметь значение относительно того же каталога.

Нет гарантии, что строки имен в результирующем массиве появятся в любом конкретном порядке; они не являются, в частности, гарантированно появятся в алфавитном порядке.

Возвраты: массив абстрактных путей, обозначающих файлы, и каталогов в каталоге, обозначенных этим абстрактным путем. Массив будет пуст, если каталог пуст. Возвращает null, если это абстрактное имя пути не обозначает каталог, или возникает ошибка ввода-вывода .

+0

Спасибо, и я думаю, что это поможет решить проблема. Я попытаюсь использовать FileFilter или FilenameFilter, чтобы убедиться, что сканируются только каталоги, которые я хочу сканировать. Меня смутило, что я знал, что каталоги, которые я просматривал, определенно не были пустыми и существовали - отсюда и отсутствие проверок. Тем не менее, теперь я вижу, что я могу вызвать метод в dot-файлах! – principal

Смежные вопросы