Java-class.getResource返回null
我使用下面的方法获取这个特定文件的URL,但它返回null。有没有人对这个问题有什么建议,或者有其他的解决方法Java-class.getResource返回null,java,url,Java,Url,我使用下面的方法获取这个特定文件的URL,但它返回null。有没有人对这个问题有什么建议,或者有其他的解决方法 URL url = ExchangeInterceptor.class.getResource("GeoIP.dat"); 不,那是正确的方法。确保资源位于类路径上。这通常是这些类型问题的原因。路径是相对于类路径根的,如果您没有给出绝对路径,它将与您正在使用的类位于同一个包中(在本例中为ExchangeInterceptor)。要在根目录中查找内容,请使用/GeoIP.dat将此Ge
URL url = ExchangeInterceptor.class.getResource("GeoIP.dat");
不,那是正确的方法。确保资源位于类路径上。这通常是这些类型问题的原因。路径是相对于类路径根的,如果您没有给出绝对路径,它将与您正在使用的类位于同一个包中(在本例中为
ExchangeInterceptor
)。要在根目录中查找内容,请使用/GeoIP.dat
将此GeoIP.dat放在何处?在与ExchangeInterceptor相同的包中,或在“根”包中。如果在同一个包中,如果在root-add“/”前缀中,则代码是OK的
也许你在用M2Eclipse?如果配置不正确,也可能导致此类问题。此类问题的另一个原因可能是:错误配置的类加载器,错误配置的OSGi,…以防有人仍然无法理解:
.getResource()授予您访问本地bin文件夹的权限。这意味着,您的资源需要位于您的项目/bin/package/中。根文件夹是YourProject/bin/,可以通过在字符串参数中添加前缀/来访问,就像iirekm所说的那样。首先,您需要确保在正确的路径上访问正确的文件。您可以通过getClass().getResource(“GeoIP.dat”).getAbsolutePath()验证这一点 其次,路径说明符区分大小写,因此请确保您的文件未命名为“geoIP.dat”或“geoIP.dat”。对于使用Intellij Idea的人:检查设置>构建、执行、部署>编译器>资源模式
该设置包含应解释为资源的所有扩展。如果扩展名不符合此处的任何模式,则class.getResource将为使用此扩展名的资源返回null。文件需要位于类路径中,例如:- bin/my/package/GeoIP.dat 前缀似乎是个谎言。下面的方法可以奏效
URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat");
我怀疑问题在于类路径中没有该文件。使用类的
ClassLoader
方法
URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat");
如果发生日食 只是一个提示。您的代码可能是正确的,但您的jre配置不正确。在检查eclipse设置之前,我遇到了相同的错误,没有任何帮助 确保正确设置了执行环境
Preferences -> Java -> Installed JREs -> use "jdk..." as compatible JRE
我通过指出IDEA上的
资源根
解决了这个问题
最初目录是这样的,图标是一个普通的文件夹图标
之前
在目录(或仅项目名称)上单击鼠标右键
)->将目录标记为
->资源根目录
之后
重新编译&ravele:p在使用IntelliJ时,我将该项目生成为JavaFX应用程序,然后向其添加maven框架支持。结果是,我将我的资源放在
src/main/resources
中,并且在代码中使用它们时,必须在每个资源名称后面添加/
同样如前面的回答中所述,只有通过类加载器加载资源才有效
因此,对我来说,最终的URL加载是通过以下方式完成的:
URL=getClass().getClassLoader().getResource(String.format(“.ssample.fxml”,File.separatorChar))代码>
文件.separatorChar
在*nix上返回/
,在windows上返回\
。如果您使用的是Gradle和IntelliJ,和更改资源模式
不起作用,和您的资源根设置正确…您可以尝试以下操作:
Settings>Build、Execution、Delpoyment>buildtools>Gradle>Runner>将IDE构建/运行操作委托给Gradle
。(IntelliJ 2017.3.3)
来源:我也遇到过类似的问题。从Java SE API获取:
如果名称以“/”开头(“\u002f”),则资源的绝对名称是名称中“/”后面的部分
因此,我在目录前面添加了'/'
:MyClass.class.getResource(“/dir\u name/”)
在您的情况下,请尝试在文件名之前添加“/”
:
URL=ExchangeInterceptor.class.getResource(“/GeoIP.dat”)
不要将资源文件与源文件放在同一文件夹中,而是创建一个与java
源文件夹平行的resources
文件夹
之前:
- src
- 主要
- 爪哇
- MyClass.java
- file.bin
- file.txt
之后:
- src
- 主要
- 爪哇
- MyClass.java
- 资源
- file.bin
- 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
我意识到使用新文件(位置)在#dev中可以很好地工作,也可以访问/project文件夹之外的文件它根本不指向特定的文件夹。它只是指向类路径。你应该反过来看:你所说的bin文件夹是运行时类路径的一部分。好吧,我也尝试过使用相同的方法,但得到了与原始海报相同的错误。我通过将文件添加到我提到的路径来修复它,所以我想我应该分享这个“发现”,您刚刚发现了类路径的一个路径。OP已经在类路径中了,OP只是在访问