递归搜索目录,但系统目录的NullPointerException

时间:2013-10-25 11:28:52

标签: java recursion

我正在使用此代码在给定目录中递归搜索特定文件模式:

if (file.isDirectory()) {
        System.out.println("Searching directory ... "
                + file.getAbsoluteFile());
        if (file.canRead()) {
            System.out.println("Can read...");
            if (file.listFiles() == null) {
                System.out.println("yes it is null");
            }
            for (File temp : file.listFiles()) { // Problemetic line
                if (temp.isDirectory()) {
                    search(temp);
                } else {
                    // code to find a file
                }
            }
}

上面的代码输出我这样(我也得到例外):

Searching directory ... C:\swsetup\SP46840\Lang\zh-TW
Can read...
Searching directory ... C:\System Volume Information
Can read...
yes it is null

例外是:

Exception in thread "main" java.lang.NullPointerException
at Demo.search(Demo.java:61)
at Demo.search(Demo.java:63)

在我的代码中,该行指向:(file.listFiles()),因为它试图从系统目录中获取文件列表,如“系统卷信息”。我假设因为它是一个系统目录,所以可能会发生一些我不知道的问题。

我的问题是:

  • 如何处理这种情况,以便NullPointerException循环继续发生foreach
  • 或者更好的是如何首先避免异常(比如通过检查它是否是系统目录等)?

有人可以指导我吗?注意:这种情况发生在Windows XP中(几个月前我在Windows 7中进行了测试,但我认为在那里没有发生问题)

3 个答案:

答案 0 :(得分:2)

if (file.listFiles() == null) {
      System.out.println("yes it is null");
      continue;
}

当您发现该目录不包含任何文件时,只需continue到循环开始并检查其他目录。

因此,当您的逻辑发现任何目录不包含任何文件时,使用此方法,您将在此检查后跳过所有处理(foreach循环),并且您将避免NullPointerException并成功跳过当前目录。 / p>

在循环中测试前提条件的标准方法

foreach(.....){

 //check for preconditions
 continue; // if preconditions are not met

 //do processing

}

答案 1 :(得分:1)

试试这个:

if (file.isDirectory()) {
        System.out.println("Searching directory ... "
                + file.getAbsoluteFile());
        if (file.canRead()) {
            System.out.println("Can read...");
            if (file.listFiles() == null) {
                System.out.println("yes it is null");
            } else { /* add the else */
              for (File temp : file.listFiles()) { // Problemetic line
                  if (temp.isDirectory()) {
                      search(temp);
                  } else {
                      // code to find a file
                  }
              }
            }
}

答案 2 :(得分:1)

来自javaDoc的

 An array of abstract pathnames denoting the files and
 directories in the directory denoted by this abstract
 pathname.  The array will be empty if the directory is
 empty.  Returns <code>null</code> if this abstract pathname
 does not denote a directory, or if an I/O error occurs.

因此,最好检查Narendra Pathai的anwser中的null和使用方法