【问题标题】:Can't Access File in Resources Folder无法访问资源文件夹中的文件
【发布时间】:2019-10-09 05:29:03
【问题描述】:

我正在尝试加载存储在 /src/main/resources 文件夹中的图像。但是,当我这样做时,我不断遇到由于找不到资源而导致的 NullPointerException。

这里是sn-p的代码:

        try {
            String path = this.getClass().getClassLoader().getResource("bern.png").toString();
        } catch (IOException ex) {
            System.out.println(path);
        }

这是我的项目文件树的图像:

这是我的目标构建文件树的图像:

这里是 NullPointerException 堆栈跟踪: https://pastebin.com/KqJVxWEL

我已经尝试很好地使用我能想到的图像文件的所有可能路径。 (/src/main/resources/bern.png、src/main/resources/bern.png、/bern.png 等)。

我也尝试过使用getClass().getClassLoader().getResource() 而不是getClass().getResource()。据我了解,getResource()ClassClassLoader 版本之间的唯一区别是Class 版本相对于根而言并非本质上是绝对的,而ClassLoader 版本是。

当我运行getClass().getResource("").toPath() 时,我得到了指向classes 目录的路径。这与我读到的有关使用目标构建文件树的getResource() 方法的内容一致。但是,我在目标构建中的任何地方都没有看到资源文件夹;我认为这是我问题的核心。我只是不确定如何解决它。

我知道这个问题之前已经被问过很多次了,但是这个问题的其他版本的答案对我没有多大帮助。

我使用的是 NetBeans 11,这个项目在 Maven 构建系统上运行。过去我没有用 Maven 做太多的工作,所以如果这个问题非常容易解决,请原谅我。

有人知道我是怎么处理这个错误的吗?

编辑:问题与我的项目结构或代码无关,如通过命令行使用mvn 运行时正确编译的代码所示。因此,这特别是 NetBeans 以及它查看资源文件夹的方式存在问题。

【问题讨论】:

  • @ElliottFrisch,不幸的是,ClassLoaderClass 方法仍然会导致 NullPointerException。
  • Re "a NullPointerException that stems from the resource not being found",贴出与你贴出的代码相匹配的堆栈跟踪。
  • @skomisa,添加了,虽然我不确定它说明了多少。
  • 我在目标目录的任何地方都看不到bern.png

标签: java maven netbeans


【解决方案1】:

将资源内容作为流读取(而不是 URL 或文件路径)

public static void main(String[] args) throws IOException {
        InputStream in = Application.class.getClassLoader().getResourceAsStream("bern.png");
        BufferedImage testImage = ImageIO.read(in);
        ImageIcon icon = new ImageIcon(testImage);
    }

【讨论】:

  • 不幸的是,仍然遇到错误。如果我将in 传递给ImageIO.read(),我会得到IllegalArgumentException: input == null。由于某种原因仍未找到资源。
  • 这真的很奇怪。上面的代码对我来说执行得很好。您是否正在使用 netbean 运行您的代码?还是使用 maven 插件?
  • 我正在使用 NetBeans 运行它,是的。您是否通过单击Source Packages 节点并添加新文件夹来创建资源文件夹?还是您以其他方式做到的?
  • 为了调试方便,你可以在构建.jar之后运行你的程序吗?另外,尝试运行mvn exec:java -Dexec.mainClass="com.exampe.Main"
  • 资源文件夹图标看起来像一个源文件夹图标,这可能会使您的 IDE 感到困惑。 (不是 netbeans 用户,所以我无法对文件夹类型提出具体建议)。尝试通过 mvn 命令(上面发布)从命令行运行您的代码。如果你的代码在那里工作,你可以断定 IDE 有问题并朝那个方向调试。在我的例子中,maven 自动创建了资源文件夹,因为我指定了一个原型。
猜你喜欢
  • 2017-09-09
  • 1970-01-01
  • 2015-07-08
  • 2021-03-24
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多