0

考虑这个标准的目录遍历代码:

static void walk(File f) throws IOException{
    System.out.println(f.getPath());

    if(f.isFile()) return;  // leaf

    File[] subs = f.listFiles(); // If it aint a file, it's a directory. Right? 

    if(subs == null) return; // returns null at some point

    for(File subDir : subs){
        walk(subDir.getAbsoluteFile()); 
    }
}

如果我在以下目录结构上执行它:c:\ -> Folder1 -> Folder2 (=a symbolic link to c:\Folder1),有时会f.listFiles()返回null. 从文档中,listFiles

如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。

显然,路径表示目录。这可能意味着发生了 I/O 错误。但是错误本身是什么?

4

1 回答 1

1

有趣的是,如果您进行此更改

if(subs == null) 
{
    System.out.println("is now null");
    File h = new File(f,"t");
    h.createNewFile();
    return; // returns null at some point
}

尝试在堆栈顶部创建一个文件,你会得到这个异常:

java.io.IOException: The name of the file cannot be resolved by the system
       at java.io.WinNTFileSystem.createFileExclusively(Native Method)
       .....

另外,如果您只是添加检查它是否是目录

if(!f.isDirectory())
    System.out.println("######## Not a Directory  #####");

在堆栈顶部的点,这将打印,因此listFiles()返回 null 因为它不是目录,所以没有抛出异常,这将是由于操作系统和路径太长。

于 2013-08-26T22:25:23.620 回答