如何使用getClass()。getResource()方法

时间:2012-08-24 05:01:59

标签: java

当我创建ImageIcon类对象时,我使用以下代码:

iconX = new ImageIcon (getClass().getResource("imageX.png"))

当.png位于该类的同一文件夹中时,上述代码可在applet或桌面应用程序中正常运行。

问题是:当.Png在另一个文件夹中时,如何避免NullPointerException?或者当对象位于与类不同的位置时,如何在对象ImageIcon中加载图像?

我不明白这种方法是如何运作的,如果有人能帮助我,我会很感激。谢谢!

3 个答案:

答案 0 :(得分:4)

看看这个 - Class#getResource(java.lang.String)

请点击上面的链接阅读文档,然后按照以了解正在发生的事情。

它说 -

  

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

  

否则,绝对名称的格式如下:

     modified_package_name/name
     

其中modified_pa​​ckage_name是此对象的包名称,其中'/'替换为'。'。

因此,如果此对象(您调用getResource的地方)在包/pkg1中(/,则表示pkg1位于类路径的根目录下)并且您使用了“imageX.png”,那么结果将是pkg1/imageX.png,这是正确的,因为这是图像所在的位置。

但是,如果我们将资源(imageX.png)移动到其他某个包/pkg2并且您以同样的方式调用该方法,那么结果仍然是pkg1/imageX.png,但这次它将是不正确的,因为资源实际位于/pkg2。那是你最后的NPE。

最好从类路径的根开始明确指定资源的完整路径。 (例如“/pkg/imageX.png”)。

希望这有帮助。

答案 1 :(得分:2)

只需提供资源的路径。

因此,如果您将图像放在Jar中的“/ resources / images”中,则只需使用

即可
iconX = new ImageIcon(getClass().getResource("/resources/images/imageX.png"))

基本上你所说的是类加载器,请在类路径中搜索以下资源。

答案 2 :(得分:1)

如果图像是内部的(你想要一个相对于你的项目的位置,或者可能打包到你的jar中),那么疯狂的程序员说:

iconX = new ImageIcon(getClass().getResource("/path/imageX.png"))

路径是相对的,因此path /将是与项目相同的文件夹中的文件夹(或打包到jar中)。

如果你想要一个外部图像,只需将ImageIcon构造函数放在路径上(例如“C:/.../ file.png”)。但不建议这样做,因为最好将它用作资源。

有关ImageIcon构造函数的更多信息,请参阅here。有关加载类资源的更多信息,请参阅here(Javadoc链接)