【问题标题】:Java resources, returns nullpointerJava 资源,返回空指针
【发布时间】:2013-02-11 05:24:20
【问题描述】:

我在我使用的 Eclipse 中的资源文件夹中有一个图像,问题是我不知道如何包含它,绝对路径很长,getResource 返回一个空指针。我搜索了谷歌和 SO,并尝试了通常的解决方案,但无济于事。资源文件夹在我的构建路径中,我从中运行代码的类在构建路径中,但以下两个都返回 null。

System.out.println(getClass().getResource("data.txt"));
System.out.println(getClass().getResource("/resources/data.txt"));

现在正在尝试:

System.out.println(getClass().getResource("001.txt"));

仍然返回 null。

System.out.println(getClass().getResource("/001.txt"));

也为空。

右键单击文件并找到其相对于工作区的路径(右键单击文件、属性、路径)

System.out.println(getClass().getResource("/ovinger/resources/sokoban_levels/001.txt"));

也为空

这是工作区和资源文件夹的图像。代码从“TestSokoban.java”运行 我什至担心eclipse没有权限搜索我的桌面,以管理员身份运行,仍然是同样的问题。

【问题讨论】:

  • 你看过[这个答案][1]吗?似乎是您问题的答案。 [1]:stackoverflow.com/questions/2343187/…
  • 图像文件名更糟糕。如果不知道它在类路径中的位置,就很难提供帮助。
  • 以下所有答案都返回null,我在这里不知所措。想象一下在不同的资源文件夹中有大量图像进行组织的项目,我是否必须找到绝对路径?

标签: java resources


【解决方案1】:

请记住,Eclipse 将默认执行位于bin 文件夹或target 文件夹中的编译代码,如果您将maven 用于项目。这意味着您必须构建项目。

执行构建后,查看bin 文件夹并查找文件。那是您必须加载的路径。

假设您这样做并且资源以classpath root 结尾,那么标准方式是:

ClassLoader.getSystemResourceAsStream("file.txt");

但如果您仍然遇到问题,请尝试:

Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt");

如果您在 spawn 中执行 java class,后一种形式会有所帮助。

【讨论】:

    【解决方案2】:

    没有什么比通过运行System.out.println(getClass().getResource(".")); 找出相对路径的根目录更容易的了。然后修改路径以正确适应相对路径。顺便说一句,它应该是类所在的包。

    【讨论】:

    • 接受这个作为我的答案,因为这样做帮助我找到了资源文件夹的相对路径。我仍然认为 .getResource() 会找到任何给定文件,只要它位于您的构建路径中的某个位置,因为 OP 中的图像显示资源文件夹是。
    【解决方案3】:

    getClass().getResource() 从类路径读取,而不是从文件系统路径读取。因此,您应该使用类路径根目录中的包/资源表示法。

    【讨论】:

      【解决方案4】:

      你不会使用 BufferedReader 并将文件读入字符串吗?

      【讨论】:

      • 它仍然应该打印出一个对象地址。
      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多