文件java.lang.NullPointerException。错误

文件java.lang.NullPointerException。错误,java,file,exception,nullpointerexception,directory,Java,File,Exception,Nullpointerexception,Directory,我有以下代码,用于列出特定文件夹/目录中的所有文件 对于mac来说,这非常有效,但对于windows,我得到了java.lang.NullPointerException。我不完全确定我将如何修复它,我知道这意味着一个目录文件变量在放入函数时被传递为Null。但我不知道如何检查目录是否为空,以及为什么它只在该特定目录上创建错误,因为它在所有其他目录上工作,而它不工作的目录只是Windows上的常规文档目录。我对显示java.lang.NullPointerException错误的三行代码做了一个

我有以下代码,用于列出特定文件夹/目录中的所有文件

对于mac来说,这非常有效,但对于windows,我得到了java.lang.NullPointerException。我不完全确定我将如何修复它,我知道这意味着一个目录文件变量在放入函数时被传递为Null。但我不知道如何检查目录是否为空,以及为什么它只在该特定目录上创建错误,因为它在所有其他目录上工作,而它不工作的目录只是Windows上的常规文档目录。我对显示java.lang.NullPointerException错误的三行代码做了一个小评论

我还尝试通过环绕文件列表函数来检查文件夹是否为空来修复它。但这不起作用,因为已经很晚了,文件变量声明中已经出现了null错误

public static void main() throws IOException {

        if (isMac()) {
            listFilesForFolderMac(folderMac1);
            listFilesForFolderMac(folderMac2);
            listFilesForFolderMac(folderMac3);
            listFilesForFolderMac(folderMac4);
            listFilesForFolderMac(folderMac5);
            listFilesForFolderMac(folderMac6);
            listFilesForFolderMac(folderMac7);
        } else if (isWindows()) {
            listFilesForFolderWin(folderWin1);
            listFilesForFolderWin(folderWin2);
            listFilesForFolderWin(folderWin3);
            listFilesForFolderWin(folderWin4);
            listFilesForFolderWin(folderWin5);
            listFilesForFolderWin(folderWin6);
        }

    }

    public static boolean isWindows() {
        return (OS.indexOf("win") >= 0);
    }

    public static boolean isMac() {
        return (OS.indexOf("mac") >= 0);
    }

public static void listFilesForFolderMac(final File folder) throws IOException {
        PrintWriter writToDoc = new PrintWriter(new FileWriter("/Users/" + username + "/Documents/files.txt",true));
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolderMac(fileEntry);
            } else {
                writToDoc.println(fileEntry.getName());
            }
        }
        writToDoc.close();
    }

    public static void listFilesForFolderWin(final File folder) throws IOException {
        PrintWriter writToDoc = new PrintWriter(new FileWriter("c:\\users\\" + username + "\\Documents\\files.txt",true));
        for (final File fileEntry : folder.listFiles()) { //Error here
            if (fileEntry.isDirectory()) {
                    listFilesForFolderWin(fileEntry); //Error here
            } else {
                writToDoc.println(fileEntry.getName());
            }
        }
        writToDoc.close();
    }

    final static File folderMac1 = new File("/Users/" + username + "/Pictures");
    final static File folderMac2 = new File("/Users/" + username + "/Documents");
    final static File folderMac3 = new File("/Users/" + username + "/Movies");
    final static File folderMac4 = new File("/Users/" + username + "/Music");
    final static File folderMac5 = new File("/Users/" + username + "/Downloads");
    final static File folderMac6 = new File("/Users/" + username + "/Applications");
    final static File folderMac7 = new File("/Users/" + username + "/Desktop");


    final static File folderWin1 = new File("C:\\Users\\" + username + "\\Desktop");
    final static File folderWin2 = new File("C:\\Users\\" + username + "\\Downloads");
    final static File folderWin3 = new File("C:\\Users\\" + username + "\\Documents"); //Error here
    final static File folderWin4 = new File("C:\\Users\\" + username + "\\Pictures");
    final static File folderWin5 = new File("C:\\Users\\" + username + "\\Music");
    final static File folderWin6 = new File("C:\\Users\\" + username + "\\Videos");
我得到以下错误说明如下

Exception in thread "main" java.lang.NullPointerException
    at script.MyClass.listFilesForFolderWin(MyClass.java:200)
    at script.MyClass.listFilesForFolderWin(MyClass.java:202)
    at script.MyClass.main(MyClass.java:155)

我搞乱了Java的文件命令,通常当你得到一个NullPointerException时,这意味着你给它的目录是错误的。我没有在windows上运行您的代码,但对于该平台,您所需要做的就是遵循与Mac路径相同的文件结构。以下是您的第一个变量:

final static File folderWin1=新文件(“C:/Users/“+username+”/Pictures”)


所有其他变量都应该遵循相同的结构。我希望这能解决您的问题。

Windows中有一些文件夹是Java可以看到但看不到的,还有一些文件是Java作为目录看到的。要解决您的问题,只需在尝试列出文件之前进行检查:

if (fileEntry.isDirectory()&&fileEntry.listFiles()!=null) {
    listFilesForFolderWin(fileEntry);
} 

java.util.File
无法处理窗口的“连接”(一种符号链接),例如“我的文档”和“图片”

您需要切换到NIO2 API,并使用
路径
API

看看哪个有处理符号链接的示例

摘自上面的链接


您可能还想查看更多详细信息

尝试单步执行此代码并调试它。您永远不会检查
文件
引用是否实际上是一个目录。Windows中的某些“目录”是一种符号链接,它不受
文件
API*的支持。永远不要检查
listFilesForFolderWin的值是否超过了该目录。我非常感谢您的输入,但在尝试之后,它仍然不起作用。我最终使用了另一个答案,然而,这个答案有一些相当有趣的信息,我不知道。非常感谢您的提醒,谢谢。
@Override
public FileVisitResult visitFile(Path file,
                               BasicFileAttributes attr) {
    if (attr.isSymbolicLink()) {
        System.out.format("Symbolic link: %s ", file);
    } else if (attr.isRegularFile()) {
        System.out.format("Regular file: %s ", file);
    } else {
        System.out.format("Other: %s ", file);
    }
    System.out.println("(" + attr.size() + "bytes)");
    return CONTINUE;
}