首先,我想解决这个问题与此处的问题非常相似: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文件夹不在源代码内,它是独立的,但包含在构建路径中。
src
com.wierd0games.under.graphics (this is a package)
Sprite
SpriteSheet
textures
spritesheetFrog.png
答案 0 :(得分:0)
根据您对问题的描述和对您问题的评论,似乎res
目录未被定义为&#34;源文件夹&#34;在Eclipse中。您将res
旁边的图标描述为&#34;三本小书&#34;,这非常奇特,因为此图标表示res
是一个Classpath容器。你如何设法将res
定义为Classpath容器超出了我的范围(请告诉我们!),但无论如何,Classpath Containers不会导出到JAR。
你应该撤消你为项目定义res
所做的一切,并正确地重新定义它:
res
文件夹。