1

今天我写了一个小的Java程序来查找我的硬盘上的文件,部分是因为Windows缺少一个合适的,部分是因为它是为了好玩。它只是遍历目录的所有子目录,如果它们是目录,则递归遍历所有子目录。但后来我有一个NullPointerException. 经过一段时间后System.out.println()'stry-catch block我发现这发生在某些目录上,例如D:\System Volume Information,C:\Users\Public\Documents\My VideosC:\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甚至SecurityExceptionIDontCareWhatKindOfExceptionButPleaseNoNullPointerExceptionException

我知道我可以只try-catchforNPEs或检查 for null,但我真的很好奇为什么没有正确的Exceptionthrows 。

由于我不喜欢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。使用起来几乎是痛苦的。

4

2 回答 2

3

简短的回答:

  • 安装JDK 7;
  • 使用新的FilesAPI。

在那之后你再也不会回来了File

于 2013-01-11T19:18:15.780 回答
2

之所以如此,是因为API的设计者在函数的合约(文档+签名)中正确识别了原因:

如果此抽象路径名不表示目录,则此方法返回 null。否则返回一个 File 对象数组,一个对应于目录中的每个文件或目录。结果中不包括表示目录本身和目录父目录的路径名。每个生成的抽象路径名都是使用 File(File, String) 构造函数从这个抽象路径名构造的。因此,如果这个路径名是绝对的,那么每个生成的路径名都是绝对的;如果此路径名是相对的,则每个生成的路径名都将相对于同一目录。

它返回 null 并给出具体原因。

由于代码的美学价值,我不喜欢 try/catch 和检查 null

这可能是 API 的“缺点”,但您公然无视它,因此您的程序崩溃了。

于 2013-01-11T19:09:11.593 回答