我的问题不是空指针异常。 我的问题是为什么在C中进行文件搜索时:我得到了零点异常,即使我可以列出内容。 我做了一个类来搜索文件。 如果我在目录中搜索,一切正常。 但是如果我在像c或d这样的驱动器中搜索,我会得到一个nullpointer异常。 我该如何解决这个问题?
这里是代码:
import java.io.File;
import java.util.ArrayList;
/**
* Created by Marcwe on 12/02/2017.
*/
public class FileSearch {
ArrayList<String> listOfResult = new ArrayList<>(10);
public FileSearch(File searchPath, String theFile) {
ArrayList<String> oneList = new ArrayList<>(10);
listOfResult = searchTheFile(theFile, searchPath, oneList);
for (String x : listOfResult) {
System.out.println(x);
}
};
public ArrayList<String> searchTheFile(String theFileToSearch, File inThePath, ArrayList<String> aList) {
File pathToSearch = inThePath;
if (!(inThePath == null)) {
for (File item : pathToSearch.listFiles()) {
if (!(item == null) && !(item.isFile())) {
System.out.println(item.getAbsolutePath());
aList = (searchTheFile(theFileToSearch, item, aList));
} else {
if (!(item == null)) {
if (item.getName().equalsIgnoreCase(theFileToSearch)) {
aList.add(item.getAbsolutePath());
}
}
}
}
}
return aList;
}
public static void main(String[] args) {
FileSearch searchTest = new FileSearch(new File("C:/"), "test.txt");
}
}
答案 0 :(得分:1)
FileSearch searchTest = new FileSearch(new File("C:/"), "test.txt");
在此处浏览所有磁盘以查找文件 可能是
列出的某些文件夹或文件 for (File item : pathToSearch.listFiles()) {
以递归方式调用无法使用Java File API列出
我认为您可能会遇到虚拟或隐藏文件夹的问题
Javadoc指示如果此抽象路径名(此处为pathToSearch
变量)不表示目录,或者发生I / O错误,则它可能返回null。由于文件系统可能具有许多特殊性,因此它相当宽泛并且javadoc无法引用它们。
此外,您可能会错过列出某些文件夹或文件的权利。哪个可能会上升SecurityException
。
这是Javadoc关于File[] java.io.File.listFiles()
的回复:
返回:
表示文件和目录的抽象路径名数组 此抽象路径名表示的目录。阵列将是 如果目录为空则为空。如果此抽象返回null pathname不表示目录,或者发生I / O错误。 抛出:SecurityException - 如果存在安全管理器及其 SecurityManager.checkRead(String)方法拒绝对。的读访问 目录自: 1.2
所以我想你不应该在foreach中直接调用listFiles(
)因为null
值会产生NullPointerException
:
for (File item : pathToSearch.listFiles()) {
您应该调用listFiles()
来检索File
数组并仅在不是null
的情况下执行循环:
File[] files = pathToSearch.listFiles();
if (files != null){
for (File item : files) {
...
}
}
此外,您应该捕获SecurityException
,因为文件夹或文件可能缺少权限,以避免在运行时出现意外异常,从而阻止搜索完成。
最后,您可以通过应用失败快速原则来降低方法的嵌套级别:您尽快处理失败的情况。
当你使用递归时,你应该非常直接地阅读这个方法。
public ArrayList<String> searchTheFile(String theFileToSearch, File inThePath, ArrayList<String> aList) {
File pathToSearch = inThePath;
if (inThePath != null)) {
// fail fast cases
File[] files = null;
try {
files = pathToSearch.listFiles();
} catch (SecurityException e) {
return aList;
}
if (files == null) {
return aList;
}
// nominal case
for (File item : files) {
...
}