getResource(String name)返回null?

时间:2014-05-25 15:40:52

标签: java eclipse jar getresource

首先,我想解决这个问题与此处的问题非常相似:getResources() returns an empty Enumeration。我之所以选择这样问是因为我的问题更多的是JAR文件问题,还因为之前的问题尚未得到解答。另外,这在技术上完全是一种不同的方法(getResource(String)而不是getResources())。现在已经不在了......

当我的代码位于Runnable JAR文件中时,我收到了一条神秘的错误消息,但当我在Eclipse中测试项目时,这根本不会发生。错误消息是:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.wierd0games.Under.graphics.Sprite.<clinit>(Sprite.java:13)
    at com.wierd0games.Under.main.Main.<init>(Main.java:53)
    at com.wierd0games.Under.main.Main.main(Main.java:57)
Caused by: java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1388)
    at com.wierd0games.Under.graphics.SpriteSheet.load(SpriteSheet.java:27)
    at com.wierd0games.Under.graphics.SpriteSheet.<init>(SpriteSheet.java:22)
    at com.wierd0games.Under.graphics.SpriteSheet.<clinit>(SpriteSheet.java:13)
    ... 3 more

从我对这个错误的解释来看,问题出现在第13行的Sprite类中。在这里,我创建了我的第一个Sprite:

public static Sprite frog=new Sprite(0, 0, 64, SpriteSheet.frog);

然后错误的第二部分意味着真正的问题出现在SpriteSheet类中,该类由frog的初始化sprite对象调用。我使用ImageIO.read的唯一一次是在函数load(){}中,它是:

private void load() {
    try {
        BufferedImage image=ImageIO.read(SpriteSheet.class.getResource(path));
        int w=image.getWidth();
        int h=image.getHeight();
        image.getRGB(0, 0, w, h, pixels, 0, w);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

...其中path是一个"/textures/spritesheetFrog.png"的String,因为Sprite Sheet位于名为textures的文件夹中,名为spritesheetFrog.png。

因此,如果错误是输入为null,我是否正确,因为某些原因函数getReasource(String)返回null?有没有人知道为什么会发生这种情况,为什么它只发生在Runnable JAR中,最重要的是,如何修复它?


编辑:这是我的班级的层次结构:

src
    com.wierd0games.under.graphics (this is a package)
        Sprite
        SpriteSheet
res
    textures
        spritesheetFrog.png

因此,如果SpriteSheet是我的调用类,为什么/textures/spritesheetFrog.png不起作用?第一个斜线应该让它回到开头,那么它应该去spritesheetFrog.png,对吧?如果没有,有人可以解释为什么这不起作用以及它应该是什么?


编辑:为了避免混淆,res文件夹不在源代码内,它是独立的,但包含在构建路径中。


编辑:好的,我在Eclipse中更改了我的层次结构,以便纹理确实在源代码下。我想我也会在这里更新它,因为我还没有得到一个帮助我解决这个问题的答案。

src
    com.wierd0games.under.graphics (this is a package)
        Sprite
        SpriteSheet
    textures
        spritesheetFrog.png

1 个答案:

答案 0 :(得分:0)

根据您对问题的描述和对您问题的评论,似乎res目录未被定义为&#34;源文件夹&#34;在Eclipse中。您将res旁边的图标描述为&#34;三本小书&#34;,这非常奇特,因为此图标表示res是一个Classpath容器。你如何设法将res定义为Classpath容器超出了我的范围(请告诉我们!),但无论如何,Classpath Containers不会导出到JAR。

你应该撤消你为项目定义res所做的一切,并正确地重新定义它:

  1. 在项目的根目录下创建res文件夹。
  2. 右键单击它,选择&#34;构建路径&#34; - &GT; &#34;用作源文件夹&#34;
  3. 再次导出您的JAR。