2010-11-29 95 views
33

我正在使用以下来获取此特定文件的URL,但它返回null。有没有人有任何关于这个问题的建议或另一种方式来做到这一点?Java - class.getResource返回null

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

回答

4

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

25

该路径是相对于classpath根目录的,如果你没有给出绝对路径,它将与你正在使用的类(在本例中为ExchangeInterceptor)在同一个包中查找。要找到根中使用的东西,请使用/GeoIP.dat

+2

这真的是答案。其他一切只是有点荒谬。除了IntelliJ提示。 – Schultz9999 2015-01-05 21:57:30

1

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

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

2

万一有人仍然有问题,要明白:

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

+3

它并没有指向特定的文件夹。它只是指向类路径。你应该看到它:你正在谈论的bin文件夹是运行时类路径的一部分。 – BalusC 2012-04-22 23:15:08

+0

好吧,我也尝试过使用相同的方法,并得到与原始海报相同的错误。我通过将文件添加到我提到的路径来修复它,所以我认为我应该分享这个“发现” – merovin 2012-04-22 23:45:53

+2

您刚刚发现了类路径的其中一个路径。 OP已经在类路径中,OP只是用错误的路径访问它。 – BalusC 2012-04-23 01:10:11

-2

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

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

+2

你会得到NullRef,因为`getResource`返回`null`,请记住? – Schultz9999 2015-01-05 21:58:09

36

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

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

+1

我一直在使用IDEA超过10年,甚至从来不知道这个设置。谢谢! – 2014-01-21 17:28:35

1

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

斌/我的/包/ GeoIP.dat

的/前缀似乎是一个谎言。以下将起作用。

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

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

14

使用类ClassLoader

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

getResource方法在的情况下。

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

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

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

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

最初的目录是如此和图标是在一个目录中一个普通的文件夹图标

以前

enter image description here

Right click(或只是工程名) - >Mark directory As - >Resource Root

after

重新编译&欢喜:P

0

虽然使用的是IntelliJ,我生成该项目作为一个JavaFX应用程序,然后添加Maven的框架支持它。事实证明,我将资源置于src/main/resources,并且必须在代码中使用它们的每个资源名称后面添加./

也如前面的答案中所述,只有通过classLoader加载资源才起作用。

所以对我来说,最终的URL装载用做:

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

File.separatorChar回报/在* nix和\在Windows上。

1

如果您使用摇篮和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