繁体   English   中英

文件java.lang.NullPointerException。 错误

[英]File java.lang.NullPointerException. error

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

对于Mac,这是完美的工作方式,但是当涉及到Windows时,我得到了java.lang.NullPointerException。 我不确定要如何解决它,我知道这意味着将目录File变量之一放入函数时作为Null传递。 但是我不确定如何检查目录是否为空,以及为什么它仅在该特定目录上会产生错误,因为它可以在所有其他目录上工作,而无法使用的目录只是Windows上的常规文档目录。 我对显示java.lang.NullPointerException错误的三行做了一点评论。

我还试图通过围绕文件列表功能来检查文件夹是否为空来修复它。 但这不起作用,因为已经很晚了,在File变量声明中已经发生了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拥有的文件命令,通常当您得到NullPointerExcpetion时,这意味着您指定的目录是错误的。 我尚未在Windows上运行您的代码,但是对于该平台,您需要做的就是遵循与Mac路径相同的文件结构。 这是您的第一个变量应为:

final static File folderWin1 = new File("C:/Users/" + username + "/Pictures");

其余所有变量均应遵循相同的结构。 我希望这可以解决您的问题。

Windows中有一些Java可以看到但看不到的文件夹,以及一些被视为目录的文件。 要解决您的问题,只需在尝试列出文件之前检查一下即可:

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

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

您将需要切换到NIO2 API并使用Paths API。

请参阅遍历文件树 ,其中实际上有一个处理符号链接的示例

从上面的链接中提取

@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;
}

您可能还希望查看链接,符号或其他内容,以获取更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM