java.lang.NullPointerException при попытке прочитать файлы - PullRequest
0 голосов
/ 15 марта 2011

Привет, у меня есть небольшая программа, которая получает каталог из командной строки и добавляет все файлы в этом каталоге и его подпапках ... так вот код:

package oop.ex1.filescript;

import java.io.*;
import java.util.ArrayList;

public class MyFileScript {

public static void main(String[] args) {

    File dir = new File(args[0]);
    //LINE 13
    ArrayList<File> files = readAllFiles(dir.listFiles());

}

private static ArrayList<File> readAllFiles(File[] dir){

    ArrayList<File> result = new ArrayList<File>();
            //LINE 28
    for(File itr : dir) {
        result.add(itr); 
        if (!itr.isFile()) {
            File[] temp = itr.listFiles();
                            //LINE 32
            ArrayList<File> deeperList = readAllFiles(temp);
            result.addAll(deeperList);
        }
    }
    return result;

}

}

теперь, когда я запускаю его на определенных папках, в которых не так много файлов, все в порядке, но когда я кормлю его папками с большим количеством файлов, я получаю:

Exception in thread "main" java.lang.NullPointerException
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:28)
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:32)
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:32)
at oop.ex1.filescript.MyFileScript.main(MyFileScript.java:13)

любая идея о том, почемутакое случается?Спасибо!ps я пометил номера строк!

Ответы [ 6 ]

3 голосов
/ 15 марта 2011

Похоже, dir.listFiles вернул null.

Цитируя документ, "возвращает null, если это абстрактное имя пути не обозначает каталог или если произошла ошибка ввода-вывода.".

2 голосов
/ 15 марта 2011

Переменная dir в строке 28, вероятно, равна нулю. Возможно, вы захотите включить проверку результата dir.listFiles() перед вызовом readAllFiles.

1 голос
/ 15 марта 2011

Вместо

if (!itr.isFile()) {

используйте

if (itr.isDirectory()) {

Если это не файл, он не обязательно является каталогом.

0 голосов
/ 15 марта 2011

Я бы написал так.Работает нормально при тестировании:

public static List<File> getAllChildFiles(File[] dir)
{

    List<File> result = new ArrayList<File>();
    for (File file : dir)
    {
        if (file.isDirectory())
        {
            File[] children = file.listFiles();
            List<File> grandChildren = getAllChildFiles(children);
            result.addAll(grandChildren);
        }
        else
        {
            result.add(file);
        }
    }

    return result;
}
0 голосов
/ 15 марта 2011

Я бы использовал listFile(FileFilter) и получил бы FileFilter возврат File.canRead(). Посмотрите, получите ли вы все ожидаемые файлы, а если нет, выясните, почему они не читаются.

0 голосов
/ 15 марта 2011

Вы должны сделать if (itr.isDirectory()) и проверить на ноль if (tmp != null).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...