2012-02-12 66 views
0

我遇到了运行jar文件的问题。如果我在eclipse中编译代码一切正常,但是当我导出到jar并尝试运行该程序时,它会引发错误。 错误是:jar文件中的图像资源出错

Exception in thread "main" java.lang.NullPointerException 
    at javax.swing.ImageIcon.<init>(Unknown Source) 
    at game.ChessSquare.<init>(ChessSquare.java:17) 
    at game.ChessFrame.DrawField(ChessFrame.java:131) 
    at game.ChessFrame.<init>(ChessFrame.java:38) 
    at game.Chess.main(Chess.java:7) 

所以这块抛出这个错误代码是

//text is something like "pawn" or "king".The whole image is an icon on the button 
img = new ImageIcon(getClass().getResource("white/"+text+".png")); 

据我了解,它不能找到图像,以便IMG变量为空。但我不明白为什么它在eclipse中运行。任何帮助?由于

PS @AndrewThompson

E:\Desktop>jar tvf chess.jar 
49 Sat Feb 11 23:40:06 GMT 2012 META-INF/MANIFEST.MF 
378 Sat Feb 11 22:51:04 GMT 2012 game/ChessFieldCoord.class 
1932 Sat Feb 11 23:39:48 GMT 2012 game/ChessSquare.class 
536 Sat Feb 11 22:51:04 GMT 2012 game/Chess.class 
2122 Sat Feb 11 22:51:04 GMT 2012 game/Rook.class 
2357 Sat Feb 11 22:51:04 GMT 2012 game/Bishop.class 
1946 Sat Feb 11 22:51:04 GMT 2012 game/Queen.class 
2127 Sat Feb 11 22:51:04 GMT 2012 game/Pawn.class 
1630 Sat Feb 11 22:51:04 GMT 2012 game/Knight.class 
878 Sat Feb 11 22:51:04 GMT 2012 game/Empty.class 
1642 Sat Feb 11 22:51:04 GMT 2012 game/King.class 
915 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$1.class 
841 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$2.class 
695 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$3.class 
3525 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame$Move.class 
4675 Sat Feb 11 22:52:32 GMT 2012 game/ChessFrame.class 
997 Sat Feb 11 22:51:04 GMT 2012 game/ChessFigure.class 
928 Sat Feb 11 15:49:32 GMT 2012 game/black/bishop.png 
1947 Sat Feb 11 15:49:10 GMT 2012 game/black/king.png 
1247 Sat Feb 11 15:49:38 GMT 2012 game/black/knight.png 
627 Sat Feb 11 15:49:44 GMT 2012 game/black/pawn.png 
1668 Sat Feb 11 15:49:20 GMT 2012 game/black/queen.png 
626 Sat Feb 11 15:49:26 GMT 2012 game/black/rook.png 
1493 Sat Feb 11 15:48:30 GMT 2012 game/white/bishop.png 
1889 Sat Feb 11 15:48:06 GMT 2012 game/white/king.png 
1544 Sat Feb 11 15:48:40 GMT 2012 game/white/knight.png 
1003 Sat Feb 11 15:48:48 GMT 2012 game/white/pawn.png 
2440 Sat Feb 11 15:48:12 GMT 2012 game/white/queen.png 
837 Sat Feb 11 15:48:20 GMT 2012 game/white/rook.png 

发生错误是ChessSquare.class

+0

你检查了最终的罐子里是什么? – 2012-02-12 02:32:53

+0

检查.jar文件中的文件“white/XXX.png”。仅供参考,您可以使用标准的“winzip”命令(以及JDK“jar”命令行工具)查看/编辑jar文件。 – paulsm4 2012-02-12 02:34:21

+0

http://i.stack.imgur.com/wPyuO.png - 这是chess.jar里面。我不明白的是为什么它从eclipse运行而不是从jar运行。文件夹结构总是相同的: – makey 2012-02-12 02:41:14

回答

0

正如评论指出的文件,看看你的罐子(使用WinZip的,7zip的,或类似的东西)查看资源的位置。如果它不在“白色”目录中,那么你的jar版本有问题。

至于为什么它在Eclipse中运行......这很可能是因为Eclipse在运行程序时将资源目录包含在类路径中。这意味着getClass()。getResource(...)调用找到了png。

如果您将文件保留在Eclipse中的资源目录中,它也可以将文件导出到jar中的META-INF目录中,查找资源。如果是这样的话,那么你可能已经设置了要部署到Web环境中的jar(请参阅servlet 3.0片段)。

最后一点要注意,使用getClass()。getResource(...)时要小心,因为它会将您锁定到仅查找与进行该调用的Class的ClassLoader相关的资源(取决于所讨论的ClassLoader层次结构操作)。稍后您可能希望在其他位置可以将其他图像集打包在jar中。在这些情况下,您将不得不依赖稍微不同的机制来加载图像(请参阅ClassLoader.getResources作为起点)。

编辑:这看起来严格是一个Eclipse问题。根据jar的结构,正确的路径是“game/white/king.png”。

+0

我也尝试用BlueJ导出到jar,同样的事情,它从IDE运行,但不是从jar运行。我是Java新手,但其行为对我来说似乎很陌生 – makey 2012-02-12 13:33:47

+0

右键单击包含图像的资源文件夹并检查属性(也可以查看项目的构建属性)。你正在寻找的是指示资源被复​​制到哪个目录的东西。如果你是用Ant或类似的工具来完成这个工作,你可以将资源复制到classes目录中,然后将jar目录放入jar目录,或者在zip任务之后添加它们。 – wort 2012-02-12 17:15:56

0
img = new ImageIcon(getClass().getResource("/game/white/"+text+".png")); 

请注意引导斜杠,以及game前缀。

+0

正如已经告诉过DaveNewton它不起作用。我尝试运行它时出现同样的错误。没有引导斜线它甚至不编译。在发布之前,我已经尝试过所有可能的地址组合:( – makey 2012-02-12 12:20:31

+0

*“试过**每个**可能的地址组合”*显然不是,因为**其中一个会起作用。**另外,它应该编译成OK或者没有'/',前面的'/'只表示'从类路径的根目录',如果没有'/',它将从类文件的包中搜索。 – 2012-02-12 12:24:37

0

我是个白痴,我终于明白错误在哪里了。正如我写的输出是"file:/E:/Desktop/Chess/bin/game/white/Pawn.png",请注意Pawn.png中的大P字母。但实际的图像名字是以小写字母开头的。这就是为什么它不起作用。对我来说仍然是一个谜,为什么然后它在月食中工作