文件java.lang.NullPointerException。错误
我有以下代码,用于列出特定文件夹/目录中的所有文件 对于mac来说,这非常有效,但对于windows,我得到了java.lang.NullPointerException。我不完全确定我将如何修复它,我知道这意味着一个目录文件变量在放入函数时被传递为Null。但我不知道如何检查目录是否为空,以及为什么它只在该特定目录上创建错误,因为它在所有其他目录上工作,而它不工作的目录只是Windows上的常规文档目录。我对显示java.lang.NullPointerException错误的三行代码做了一个小评论 我还尝试通过环绕文件列表函数来检查文件夹是否为空来修复它。但这不起作用,因为已经很晚了,文件变量声明中已经出现了null错误文件java.lang.NullPointerException。错误,java,file,exception,nullpointerexception,directory,Java,File,Exception,Nullpointerexception,Directory,我有以下代码,用于列出特定文件夹/目录中的所有文件 对于mac来说,这非常有效,但对于windows,我得到了java.lang.NullPointerException。我不完全确定我将如何修复它,我知道这意味着一个目录文件变量在放入函数时被传递为Null。但我不知道如何检查目录是否为空,以及为什么它只在该特定目录上创建错误,因为它在所有其他目录上工作,而它不工作的目录只是Windows上的常规文档目录。我对显示java.lang.NullPointerException错误的三行代码做了一个
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;
}