今天我写了一个小的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
告诉我:
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
forNPEs
或检查 for null
,但我真的很好奇为什么没有正确的Exception
throws 。
由于我不喜欢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。使用起来几乎是痛苦的。