GetResource 返回 null

我使用以下方法来获取这个特定文件的 URL,但它返回 null。有没有人对这个问题有什么建议或者其他的解决方法?

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat");
111830 次浏览

不,这是正确的方式。确保资源位于类路径上。这通常是这类问题的原因。

路径是相对于类路径根的,如果您没有给出绝对路径,那么它将在与您正在使用的类(在本例中为 ExchangeInterceptor)相同的包中查找。要在根目录中查找某些内容,请使用 /GeoIP.dat

你把这个 GeoIP.dat 放在哪儿了?在与 ExchangeInterceptor 相同的包中,或在“ root”包中。如果在同一个包中,代码是 OK 的,如果在 root-add’/’前缀中。

也许你正在使用 M2Eclipse?如果配置不正确,也可能导致此类问题。此类问题的另一个原因可能是: 错误配置的类加载器、错误配置的 OSGi、 ..。

以防有人还不明白:

.getResource() grants you access to the local bin folder. That means, your resources need to be located in YourProject/bin/package/. The root folder is YourProject/bin/ and can be accssed by adding the prefix / to the String argument, like iirekm said.

首先,您需要确保在正确的路径上访问正确的文件。可以通过 getClass ()验证这一点。GetResource (“ GeoIP.dat”)。GetAbsolutePath ().

其次,路径说明符是区分大小写的,所以确保您的文件没有命名为“ GeoIP.dat”或“ GeoIP.DAT”。

对于那些使用 智慧的想法的人: 检查 设置 > 构建、执行、部署 > 编译器 > 资源模式

该设置包含应解释为资源的所有扩展。如果一个扩展不符合这里的任何模式,class.getResource 将为使用这个扩展的资源返回 null。

文件需要在类路径中,例如:-

Bin/my/package/GeoIP.dat

前缀/似乎是一个谎言。

URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat");

我怀疑问题在于类路径中没有该文件。

使用类的 ClassLoadergetResource方法

URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat");

日蚀的情况下。

给你个提示。您的代码可能是正确的,但是您的 jre 配置不正确。我遇到了同样的错误,没有任何帮助,直到我检查了 Eclipse 设置。

确保您正确设置了执行环境。

Preferences -> Java -> Installed JREs -> use "jdk..." as compatible JRE

我解决了这个问题,指出了 resource root的想法。

最初的目录是这样的,图标是一个普通的文件夹图标

之前

enter image description here

目录(或者只是项目名称)上的 Right click-> Mark directory As-> Resource Root

之后

after

重新编辑和欢欣鼓舞: P

在使用 IntelliJ 时,我将该项目作为 JavaFX 应用程序生成,然后向其添加了 maven 框架支持。结果,我把我的资源放在 src/main/resources中,并且在代码中使用它们时,必须在每个资源名后面添加 ./

同样如前面的答案所述,只有通过 classLoader 加载资源才有效。

因此,对我来说,最终的 URL 加载是使用:

URL url = getClass().getClassLoader().getResource(String.format(".%ssample.fxml", File.separatorChar));

File.separatorChar在 * nix 上返回 /,在 windows 上返回 \

如果你正在使用 Gradle 和 IntelliJ,还有改变 Resource patterns不起作用,还有你的资源根设置正确... 你可以试试这个:

enter image description here

(IntelliJ2017.3.3)

资料来源: https://youtrack.jetbrains.com/issue/IDEA-176738#comment=27-2518612

我也遇到过类似的问题:

如果名称以“/”开头(“ u002f”) ,那么资源的绝对名称就是名称在“/”之后的部分。

因此,我在目录 MyClass.class.getResource("/dir_name/")之前添加了 '/'

在您的情况下,尝试在您的文件名之前添加 '/':

URL url = ExchangeInterceptor.class.getResource("/GeoIP.dat");

不要将资源文件放在与源文件相同的文件夹中,而是创建一个与 java源文件夹并行的 resources文件夹。

以前:

  • Src
        • MyClass.java
        • 文件箱
        • File.txt

之后:

  • Src
        • MyClass.java
      • 资源
        • 文件箱
        • File.txt

这是我的示例解决方案。为我工作。

项目结构:

•   Source Packages
•    game
•    Game.java
•    game.images
•    tas_right.png

在游戏课上:

URL path=this.getClass().getClassLoader().getResource("images/tas_right.png")

我可以像下面这样在文件的开头添加“ ./”来修复它:

getClass().getClassLoader().getResource("./file.txt")

我使用 Intellij 版本的 Ultimate 2019.3

去吧

设置-> 编译器-> 资源模式。

点击确定。 重新运行应用程序/服务器。

在我的情况下,我包括在项目中的 jks!

enter image description here

我意识到在 # dev 中使用 new File (location)可以很好地工作,而且还可以访问/project 文件夹外的文件

说你有:

titleLabel.setIcon(new ImageIcon(getClass().getResource("/uz/assets/icon.png")));//wrong !!

右键点击文件夹(我的是 assets)一套 Mark Directory as Resources 如果你没有看到右键点击项目名称和拾取 Open module settings

enter image description here

右键单击资源文件夹(在我的例子中是 assets) 然后选择「资源」 现在回到上面的 java 指令并删除路径,但离开 / 例如:

titleLabel.setIcon(new ImageIcon(getClass().getResource("/icon.png")));// correct one

警告所有在 Java 中使用 Path或者 Paths类的人: 如果你使用的是被上帝遗弃的操作系统 Windows,你将不能使用 Path.of或者 Paths.get,因为这会在你的路径中放置反斜杠,Java 会尝试加载它们,并且很快失败。取而代之的是:

Path.of(paths...).toString().replace(File.separator, "/")

您应该始终使用它,因为它是独立于操作系统的。如果有人有一个更好的或建在方式请评论,我无法找到一个。

奇怪的效果在我的情况下(IJ 2022.1.4)是: 关闭项目(例如,退出 IDEA) ,删除/。想法文件夹完全(鸡蛋,rm -rd .idea) ,开放项目。当它重新导入项目时,它将按预期运行。注意: 你失去了一切不包括在梯级配置。