Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归搜索目录,但NullPointerException搜索系统目录_Java_Recursion - Fatal编程技术网

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

Java 递归搜索目录,但NullPointerException搜索系统目录,java,recursion,Java,Recursion,我使用此代码在给定目录中递归搜索特定的文件模式: if (file.isDirectory()) { System.out.println("Searching directory ... " + file.getAbsoluteFile()); if (file.canRead()) { System.out.println("Can read..."); if (file.list

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

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
                }
            }
}
上面的代码像这样输出我(我也得到异常):

例外情况是:

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中进行了测试,但我认为问题没有发生)

尝试以下方法:

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
                  }
              }
            }
}
试试这个:

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
                  }
              }
            }
}
当您发现该目录不包含任何文件时,只需
继续
到循环的开头并检查其他目录即可

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

循环中先决条件测试的标准方法 当您发现该目录不包含任何文件时,只需
继续
到循环的开头并检查其他目录即可

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

循环中先决条件测试的标准方法 从javaDoc:

所以最好检查null并使用来自javaDoc的Narendra Pathai的anwser的方法:



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

也许你们并没有读取文件列表的权限?@MustafaGenç,是的,甚至我最初也这么认为。但我有权限访问那个目录。@Ashalynd,让我试试。也许你们没有权限阅读文件列表?@MustafaGenç,是的,甚至我最初也这么认为。但我有那个目录的权限。@Ashalynd,让我试试。太好了,它工作得很好!我犯了这么小的错误。谢谢你的帮助,很好,很好!我犯了这么小的错误。谢谢你的帮助。因为这基本上是一个转到。。。如果其他方法可以一直起作用的话,这是没有必要的。。。一旦你的循环增加,它会影响可读性。。。只是不要使用it@iluxaIMHO它使代码的意图比仅仅将代码嵌套在防御中更具可读性!=空检查或放置嵌套的if-else块。“继续”是一个很大的帮助,你不应该回避它。@iluxa
continue
非常好。仅仅因为你发现if/else很好阅读并不意味着我们会这样做。
continue
在这种情况下很好。。。但是一旦for循环增长到smth,比如
switch(){if(){for(){if(){for()){…
,内部for的长度为150行,它有2个
continue
s和3个
break
s,不要与
开关的
break
s混淆。如果其他类型的结构使它在least@iluxa那么也许你的方法做得太多了。这不是继续的问题,而是继续的问题可能是你的方法。因为它基本上是一个GOTO…而且它从来都不是必需的,如果其他方法可以一直工作的话…而且一旦你的循环增长,它会损害可读性…只是不要使用它it@iluxaIMHO它使代码的意图比仅仅将代码嵌套在防御中更具可读性!=空检查或放置嵌套的if-else块。continue是一个很大的帮助,你不应该回避它。@iluxa
continue
很好。仅仅因为你发现if/else很好读并不意味着我们就可以这样做。
continue
在这种情况下很好……但是一旦for循环变成smth,比如
switch(){if(){for(){if(){for()){…
,内部for的长度为150行,它有2个
continue
s和3个
break
s,不要与
开关的
break
s混淆。如果其他类型的结构使它在least@iluxa那么也许你的方法做得太多了。这不是继续的问题,而是继续的问题也许是你的方法。
if (file.listFiles() == null) {
      System.out.println("yes it is null");
      continue;
}
foreach(.....){

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

 //do processing

}
 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.