0

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

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 中进行过测试,但我认为那里没有出现问题)

4

3 回答 3

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

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

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

在循环中测试先决条件的标准方法

foreach(.....){

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

 //do processing

}
于 2013-10-25T11:31:37.330 回答
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.

所以检查 null 并使用 Narendra Pathai 的 anwser 的方法是个好主意

于 2013-10-25T11:52:12.650 回答
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
                  }
              }
            }
}
于 2013-10-25T11:30:16.577 回答