【问题标题】:listFiles method of java.io.File throws NullPointerException [duplicate]java.io.File 的 listFiles 方法抛出 NullPointerException [重复]
【发布时间】:2015-10-12 16:51:19
【问题描述】:

我正在运行此代码,它在 NetBeans IDE 中运行良好,但当我构建 JAR 文件并通过单击运行它时,它崩溃并抛出 NullPointerException

       String sepChar = File.separator;
        File homeFolder = new File(System.getProperty("user.dir"));
        File dataFolder = new File(homeFolder.getAbsolutePath() + sepChar + "Saved Images");
        System.err.println("data files is folder: "+dataFolder.isDirectory());
        System.err.println("data files is file: "+dataFolder.isFile());

        System.err.println("data files: "+dataFolder.listFiles());
        System.err.println("data folder: "+dataFolder);
        System.err.println("data folder path : "+dataFolder.getAbsolutePath());

File[]files = dataFolder.listFiles();
for(File f:files){...}

此代码在for(File f:files) 上崩溃 该代码正在访问我的闪存驱动器上的一个文件夹,我检查了路径及其正常。

println 语句的输出如下所示: 第一组用于 IDE,第二组用于命令行:

IDE 输出:

data files is folder: true
data files is file: false
data files: [Ljava.io.File;@a298b7
data folder: F:\JambTextProject\Saved Images
data folder path : F:\JambTextProject\Saved Images

命令行输出(通过运行java -jar jarName.jar获得):

data files is folder: false
data files is file: false
data files: null
data folder: F:\JambTextProject\dist\Saved Images
data folder path : F:\JambTextProject\dist\Saved Images

那会是什么? 为什么代码在IDE中运行良好,但是从jar中运行却崩溃了? 闪存驱动器有 391 MB 可用空间,要访问的文件夹大小为 163 MB,而其在磁盘上的大小为 292 MB

【问题讨论】:

  • 你应该阅读File.listFiles的javadoc。
  • 抛出 NPE 的不是 listFiles 方法,而是您试图在增强的 for 循环中迭代结果。
  • 问题不在于 NullPointer,问题在于代码在 IDE 和命令行中的行为为何不同
  • jar 文件位于 dist 文件夹中,但您在 IDE 中的代码是直接从 JambTextProject 执行的,至少从程序输出的路径来看是这样的 @ 987654330@ 和 F:\JambTextProject\dist\Saved Images

标签: java file usb-drive


【解决方案1】:

根据File.listFiles的javadoc,方法:

如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。

所以当你尝试迭代结果时,结果为 null,并发生 NullPointerException。

这意味着您的 IDE 设置与命令行不同,例如它有一个不同的工作目录。

【讨论】:

  • 那为什么我直接运行代码不会出现IO错误呢?为什么只有当我双击 jar 或从命令行运行它时才会发生。谢谢,但我已经知道为什么会发生 NullPointerException。
  • 实际上,IDE 还从命令行运行项目的同一个闪存驱动器运行项目。那么在这些情况下工作目录是否仍然不同
猜你喜欢
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多