Java - class.getResource返回null

时间:2010-11-29 06:25:25

标签: java url

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

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

18 个答案:

答案 0 :(得分:42)

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

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

答案 1 :(得分:29)

路径相对于类路径根目录,如果不提供绝对路径,则它与您正在使用的类(在本例中为ExchangeInterceptor)查找相同的包。要在根目录中查找内容,请使用/GeoIP.dat

答案 2 :(得分:17)

使用班级“getResource

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

答案 3 :(得分:9)

我通过在IDEA上指出resource root解决了这个问题。

最初目录是如此,图标是普通文件夹图标

<强>之前

enter image description here

目录上的

Right click(或只是项目名称) - &gt; Mark directory As - &gt; Resource Root

<强>后

after

重新编译&amp;高兴:P

答案 4 :(得分:4)

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

答案 5 :(得分:4)

如果您正在使用Gradle和IntelliJ,更改Resource patterns无效,您的资源根目录已正确设置。 ..你可以试试这个:

enter image description here

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

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

同样如前一个答案中所述,仅通过classLoader加载资源。

所以对我来说,最后的网址加载是使用:

完成的

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

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

答案 8 :(得分:2)

我遇到过类似的问题。来自getResource​(String name) Java SE API

  

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

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

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

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

答案 9 :(得分:1)

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

箱/我/包/ GeoIP.dat

/前缀似乎是谎言。以下是可行的。

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

我怀疑问题是你没有在类路径中使用该文件。

答案 10 :(得分:1)

你把这个GeoIP.dat放在哪里?在与ExchangeInterceptor相同的包中,或在“root”包中。如果在同一个包中,你的代码是正常的,如果在根目录中 - 添加'/'前缀。

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

答案 11 :(得分:1)

我可以通过在文件的开头添加“ ./”来解决此问题:

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

答案 12 :(得分:0)

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

之前:

  • src
    • 主要
      • java
        • MyClass.java
        • file.bin
        • file.txt

之后:

  • src
    • 主要
      • java
        • MyClass.java
      • 资源
        • file.bin
        • file.txt

答案 13 :(得分:0)

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

项目结构:

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

在游戏课中:

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

答案 14 :(得分:0)

我使用的是Intellij Ultimate Ultimate 2019.3

转到

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

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

就我而言,我在项目中加入了jks!

enter image description here

答案 15 :(得分:-2)

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

其次,路径说明符区分大小写,因此请确保您的文件未命名为“geoIP.dat”或“GeoIP.DAT”。

答案 16 :(得分:-2)

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

答案 17 :(得分:-3)

eclipse 的情况下。

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

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

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