当我通过根文件夹下的掩码搜索文件时,为什么会看到NullPointerException?(windows)

时间:2014-08-11 20:50:18

标签: java search nullpointerexception nio nio2

我研究了java nio2的可能性。

我知道我可以使用FileVisitor界面搜索文件。为了实现这个功能,我使用了glob模式。

我的例子的代码:

访客界面实现:

class MyFileFindVisitor extends SimpleFileVisitor<Path> {
    private PathMatcher matcher;
    public MyFileFindVisitor(String pattern){
        try {
            matcher = FileSystems.getDefault().getPathMatcher(pattern);
        } catch(IllegalArgumentException iae) {
            System.err.println("Invalid pattern; did you forget to prefix \"glob:\"? (as in glob:*.java)");
            System.exit(1);
        }
    }
    public FileVisitResult visitFile(Path path, BasicFileAttributes fileAttributes){
        find(path);
        return FileVisitResult.CONTINUE;
    }
    private void find(Path path) {
        Path name = path.getFileName();
        if(matcher.matches(name))
            System.out.println("Matching file:" + path.getFileName());
    }
    public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes fileAttributes){
        find(path);
        return FileVisitResult.CONTINUE;
    }
}

主要方法:

public static void main(String[] args) {
        Path startPath = Paths.get("E:\\folder");
        String pattern = "glob:*";
        try {
            Files.walkFileTree(startPath, new MyFileFindVisitor(pattern));
            System.out.println("File search completed!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这种主要方法的变体可以正常工作,但如果我改变了:

Path startPath = Paths.get("E:\\folder");

Path startPath = Paths.get("E:\\"); 

我看到以下stacktrace:

Exception in thread "main" java.lang.NullPointerException
    at sun.nio.fs.WindowsFileSystem$2.matches(WindowsFileSystem.java:312)
    at io.nio.MyFileFindVisitor.find(FileTreeWalkFind.java:29)
    at io.nio.MyFileFindVisitor.preVisitDirectory(FileTreeWalkFind.java:33)
    at io.nio.MyFileFindVisitor.preVisitDirectory(FileTreeWalkFind.java:13)
    at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:192)
    at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:69)
    at java.nio.file.Files.walkFileTree(Files.java:2600)
    at java.nio.file.Files.walkFileTree(Files.java:2633)
    at io.nio.FileTreeWalkFind.main(FileTreeWalkFind.java:42)

我不是这个问题的原因。

如何解决?

1 个答案:

答案 0 :(得分:2)

您获得空指针异常的原因是因为当您的访问者测试第一个路径(E:\)时,没有要测试的实际文件名 - 这是卷根目录。来自JDK Docs:

Path getFileName()

Returns the name of the file or directory denoted by this path as a Path object. The file name is the farthest element from the root in the directory hierarchy.

Returns:
    a path representing the name of the file or directory, or null if this path has zero elements

&#34;在这种情况下,Elements&#34;表示名称中的目录元素。 &#39; E:\&#39;没有目录元素,因为它是卷的根目录。

您不应该假设文件名始终不为空。

private void find(Path path) {          
    Path name = path.getFileName();
    if (name != null) {
        if(matcher.matches(name)) {
            System.out.println("Matching file:" + path.getFileName());
        }
    }
}

走过Windows文件系统时可能需要注意的其他事项包括:

     
  • 系统受保护的目录,例如您的助行器可能无法进入的回收站
  •  
  • NTFS结点可能导致循环回自身的递归目录,导致代码循环,直到用完堆或堆栈