【问题标题】:NullPointerException on ClassLoader.getResource()ClassLoader.getResource() 上的 NullPointerException
【发布时间】:2016-03-26 04:46:25
【问题描述】:

我正在做一个小项目,我需要将文件从应用程序 JAR 移动到 JAR 之外的另一个位置。

这就是我的 JAR 文件的样子:

MyApp.JAR
   |- META-INF
       |- MANIFEST.MF
   |- files
       |- myFile.exe
   |- MainClass.class

我想做的是将myFile.exe 移动到C:\\(例如)。 所以在MainClass我尝试了:

23. Path path = Paths.get(getClass().getClassLoader().getResource("/files/myFile.exe").toURI());
24. byte[] bytes = Files.readAllBytes(path);

25. FileOutputStream fos = new FileOutputStream("C:\\myFile.exe");
26. fos.write(b);
27. fos.close();

运行我的应用程序后,我得到一个NullPointerException,这是它:

java.lang.NullPointerException
    at MainClass.<init>(MainClass.java:23)
    at MainClass.main(MainClass.java:66)

(第 66 行是我用new MainClass(); 调用构造函数的地方)

我知道NPE 可能被抛出,因为找不到myFile.exe,但我不知道为什么... 当我打开 JAR 时,我可以看到 files 文件夹,里面有 exe。 也许我以错误的方式访问文件? 我尝试了许多其他在 StackOverflow 上找到的方法,但没有任何效果......

在此先感谢,对不起我的英语。

【问题讨论】:

  • 也许您可以将第 23 行逐行拆分为多个分配,这样就可以看到返回 null 的内容?
  • 正确的路径是files/myFile.exe,没有前导斜杠。但是你应该从getClass().getClassLoader().getResourceAsStream("files/myFile.exe")返回的 InputStream 中读取字节

标签: java file jar nullpointerexception


【解决方案1】:

我认为您在这里采取了太多笨拙的中间步骤,因为标准 Java API 不允许您立即执行此操作。我建议您使用IOUtils.copy 复制字节:

try(InputStream resourceStream = getClass().getResourceAsStream("/files/myFile.exe");
    FileOutputStream fos = new FileOutputStream("C:\\myFile.exe"))
{
    IOUtils.copy(resourceStream, fos);
} // optionally, catch IOException here (or declare it to be thrown)

如果您在提供给getResourceAsStream() 的网址方面需要帮助,请查看here

【讨论】:

    【解决方案2】:

    您使用的是绝对路径:您应该使用("files/myFiles.exe") iso ("/files/myFiles.exe")

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 2011-09-30
      • 2010-12-12
      • 2021-05-03
      • 2013-04-21
      • 2014-03-18
      相关资源
      最近更新 更多