Java - class.getResource返回null

Bud*_*dhi 50 java url

我使用以下内容来获取此特定文件的URL,但它返回null.有没有人对问题或其他方法有任何建议吗?

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat");
Run Code Online (Sandbox Code Playgroud)

ygg*_*raa 48

对于那些使用Intellij Idea的人:检查设置 - >编译器 - >资源模式.

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

  • 这个答案不适用于Maven项目 (13认同)
  • 如果有人找不到它,这些天的设置位于**设置▶构建,执行,部署▶编译器▶资源模式** (5认同)
  • 我已经使用IDEA超过10年,甚至从未知道这个设置.谢谢! (3认同)
  • @maja对于maven项目,您必须添加资源包括,例如https://maven.apache.org/plugins/maven-resources-plugin/examples/include-exclude.html-这对我有用。 (2认同)

Mar*_*ten 31

该路径是相对于类路径根的,如果您不提供绝对路径,它将查找与您正在使用的类相同的包(在本例中ExchangeInterceptor).在root用户中查找内容/GeoIP.dat.

  • 这才是答案.其他一切都只是有点荒谬.除了IntelliJ提示之外. (3认同)

Win*_*ins 19

使用getResource类的方法'ClassLoader

URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat");
Run Code Online (Sandbox Code Playgroud)

  • 为我工作,但有人能解释为什么它不能与 class.getRessource() 一起使用吗? (5认同)

Mew*_*ewX 9

我通过指出resource rootIDEA 解决了这个问题.

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

之前

在此输入图像描述

Right click在目录(或只是项目名称) - > Mark directory As- > Resource Root.

后

重新编译并高兴:P


Tar*_*nyk 8

我遇到过类似的问题。从Java SE API for getResource?(String name)

如果名称以“/”(“\u002f”)开头,则资源的绝对名称是“/”后面的名称部分。

所以我'/'在我的目录之前添加了 : MyClass.class.getResource("/dir_name/")

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

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


Max*_*Max 7

如果您正在使用 Gradle 和 IntelliJ,并且更改Resource patterns不起作用,并且您的资源根设置正确……您可以尝试以下操作:

在此处输入图片说明

Settings > Build, Execution, Delpoyment > Build Tools > Gradle > Runner > Delegate IDE build/run actions to gradle. (IntelliJ 2017.3.3)

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


jav*_*y79 5

不,这是正确的方式afaik。确保资源在您的类路径上。这通常是导致这些类型问题的原因。


小智 5

以防万一有人仍然有问题要理解:

.getResource() 授予您访问本地 bin 文件夹的权限。这意味着,您的资源需要位于 YourProject/bin/package/ 中。根文件夹是 YourProject/bin/ 并且可以通过将前缀 / 添加到 String 参数来访问,就像 iirekm 说的那样。

  • 它根本不指向特定文件夹。它只是指向类路径。您应该反过来看:您所说的 bin 文件夹是运行时类路径的一部分。 (4认同)
  • 您刚刚发现了类路径的路径之一。OP 已经在类路径中,OP 只是使用错误的路径访问它。 (2认同)

Aka*_*wal 5

在使用 IntelliJ 时,我将项目生成为 JavaFX 应用程序,然后为其添加了 Maven 框架支持。事实证明,然后我将我的资源放入其中,src/main/resources并且必须./在代码中使用它们时添加每个资源名称。

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

所以对我来说,最终的 URL 加载是使用以下方法完成的:

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

*nix 和windows上的File.separatorChar回报。/\