我正在用java FX编写GUI程序。用户可以选择系统中的任何目录。不幸的是,目录选择器让用户也选择了一个驱动器。 我们可以使用file.listFiles()列出目录中的所有文件和文件夹。如果用户选择驱动器会发生什么。 listfiles()失败,空指针异常。
有什么办法可以在java中的驱动器中获取文件和目录列表吗?
//Get files from the user computer
public void getFileNames(File folder) {
for (final File file : folder.listFiles()) {
if (file.isDirectory()) {
getFileNames(file);
} else {
if (FilenameUtils.isExtension(file.getName().toLowerCase(), videoFormatSet)) {
//Don't consider video files less than 100 MB
final Long FileSizeInMB = file.length() / 1048576;
if (FileSizeInMB < 100) {
continue;
}
final String fileName = FilenameUtils.removeExtension(file.getName());
if (!movieNameFilter(fileName).isEmpty()) {
movieFileNameList.add(movieNameFilter(fileName));
} else {
movieFileNameList.add(fileName);
}
}
编辑:
代码允许用户选择目录(文件夹变量)。 getFileNames()提取所选目录中的所有电影文件Name。当用户选择目录时,代码工作正常。
但是,JavaFx也允许用户选择一个驱动器(我正在使用目录选择器)。让我们举例来说,他在系统中选择了c drive(c :)。
file folder = E:\
的值当我在第171行中执行 folder.listFiles()时,会发生空指针异常
171: for (final File file : folder.listFiles()) {
我可以通过添加不允许用户选择驱动器的验证来避免这种情况。
但如果我想让他选择一个驱动器。有什么办法可以获得该驱动器中所有文件的列表吗?
简单地说,是否可以编写一个允许用户提供驱动器的代码(例如:C或D),以便它可以显示该驱动器中的所有文件。
堆栈追踪:
线程“Thread-5”中的异常java.lang.NullPointerException 在com.imdbrater.application.JavaFXApplication $ GetfilesThread.getFileNames(JavaFXApplication.java:171) 在com.imdbrater.application.JavaFXApplication $ GetfilesThread.getFileNames(JavaFXApplication.java:173) 在com.imdbrater.application.JavaFXApplication $ GetfilesThread.getFileNames(JavaFXApplication.java:173) 在com.imdbrater.application.JavaFXApplication $ GetfilesThread.run(JavaFXApplication.java:167) 在java.lang.Thread.run(未知来源)
答案 0 :(得分:2)
我注意到您对不同的movieNameFilter()
方法执行了一些调用,这些调用未在您发布的代码段中声明。当你在返回的对象上调用一些方法时,请确保这个方法返回一个正确的值。
你没有发布NullPointerException正在发生的地方,因此我将根据您尝试执行的操作的简单且可能的null
输出作为答案。
请确保用户输入的驱动器确实存在。
如the API documentation for java.io.File
中所示,
<强>返回:强>
一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。 如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。
在这种情况下,如果您的用户输入了不存在的路径,您将获得NPE。
处理此问题的最佳方法是首先验证用户输入。第二步是验证listFiles()
来电的输出。
// Get files from the user computer
public void getFileNames(File folder) {
// retrieve file listing
File[] fileList = folder.listFiles();
if (fileList == null) {
// throw an exception, return or do any other error handling here
return;
}
// path is correct
for (final File file : fileList ) {
// etc etc etc
}
}
如果NPE与任何其他错误有关,请发表评论,以便我可以相应地更新我的答案。
注意:请记住,Java中的文件路径是使用双反斜杠进行转义的,因此您应该按照以下方式进行调用。
File rootFolder = new File("C:\\");
getFileNames(rootFolder);
File downloadsFolder = new File("C:\\Users\\Rahul\\Downloads");
getFileNames(downloadsFolder);