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
- 或者更好的方法是首先避免异常(比如检查它是否是系统目录等)
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是一个很大的帮助,你不应该回避它。@iluxacontinue
很好。仅仅因为你发现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.