【发布时间】:2013-01-11 19:06:08
【问题描述】:
今天我写了一个小的 Java 程序来查找我的硬盘上的文件,部分原因是 Windows 缺少一个合适的程序,部分原因是它是为了好玩。它只是遍历目录的所有子目录,如果它们是目录,则递归遍历所有子目录。但后来我有一个NullPointerException。经过System.out.println()'s 和try-catch block之后,我发现这发生在D:\System Volume Information、C:\Users\Public\Documents\My Videos 和C:\ProgramData\Templates 等一些目录上。 Windows 本身说,当在资源管理器地址栏中输入“拒绝访问”时。当探索时,它们似乎被锁定了。来自java.io.File 的source 告诉我:
public File[] listFiles() {
String[] ss = list();
if (ss == null) return null; //This line seems to cause the NPE
int n = ss.length;
File[] fs = new File[n];
for (int i = 0; i < n; i++) {
fs[i] = new File(ss[i], this);
}
return fs;
}
我的问题是,为什么没有合适的说法,IOException、SecurityException,甚至是IDontCareWhatKindOfExceptionButPleaseNoNullPointerExceptionException?
我知道我可以只用try-catch 换NPEs,或者检查null,但我真的很好奇为什么没有正确的Exception 抛出。
由于我不喜欢 try/catch 并检查 null 是因为代码的审美价值,所以我做了一些讨厌的、讨厌的反射代码(有很多虚伪的 try/catch 块),它模仿了 java.io.File 的一些方法,因为它们是私有的,并且某些包(如java.io.FileSystem)是不可见的。而且因为我不关心某些 Windows 文件,所以我只是使用此代码忽略它们,给我一个空的array:
public static File[] listFiles(File mThis) {
String[] ss = list(mThis);
if (ss == null) {
//System.out.println("ss is null");
return new File[] {};
}
int n = ss.length;
File[] fs = new File[n];
for (int i = 0; i < n; i++) {
fs[i] = getNewFile(ss[i], mThis);
}
return fs;
}
编辑:为避免误解:我确实使用try/catch,我只是在美学上不喜欢它们。
EDIT2:我宁愿使用 GUI 而不是命令提示符。而且我非常不喜欢 Windows 搜索 GUI。使用起来几乎是痛苦的。
【问题讨论】:
-
你没听说过
find命令吗? -
@Woot4Moo 命令行没有合适的 GUI。我更喜欢 GUI。
-
编写一个 GUI 并以这种方式调用它?只是说微软解决了在系统上查找文件的问题,只是想知道它在 GUI 之外有什么缺点。
-
@ChristiaandeJong 如果您使用 Java 7,请忘记
File,使用Files。至少那里的 API 是健全的——例如,它会在删除失败时抛出异常,File.delete()不会!
标签: java file exception nullpointerexception