我的jar文件有问题。当我在NetBeans中运行项目时,一切正常。但是当我把它作为一个jar文件运行时,我在这个函数中得到了Null Pointer Exception:
public void setBg(int w, int h){
BufferedImage bgg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = bgg.getGraphics();
for(int i = 0; i < board.getHeight(); ++i){
for(int j = 0; j < board.getWidth(); ++j){
g.drawImage(board.getBoardElement(j, i).getImage().getScaledInstance(element_w, element_h, Image.SCALE_SMOOTH), ((j*element_w)), ((i*element_h)), this);
System.out.println(j+" "+i);
}
}
bg=bgg; //it's important to not blinkink map while it's drawing
}
每当我通过jar变量运行应用程序时,i和j在发生NullPointerException时具有不同的值。可能是什么原因?
答案 0 :(得分:4)
首先在代码中添加一些调试语句(System.out.println
或使用log4j或内置日志记录API等日志API)来检查各种变量的状态并确定代码的运行顺序。
在代码中添加断点并使用调试器逐步执行代码并检查代码的各种变量和逻辑的状态。
我“猜测”您收到异常,因为board.getBoardElement(j, i).getImage()
正在返回null
,因为您使用ImageIcon(String)
之类的内容加载图片,但图片文件要么维护在Jar文件的上下文中,或者您已从磁盘上的相对位置加载它们,并且无法再从当前Jars位置访问它们
首先确保您的图片存储在Netbeans项目的src
目录中,可能是在resources/images
或某些类似
接下来,使用ImageIO.read
加载图片,如果由于某种原因无法加载图片,则会抛出IOException
(其他像ImageIcon
一样无声地失败)。有关详细信息,请参阅Reading/Loading an Image。
接下来,使用Class#getResource
加载图片......
BufferedImage img = ImageIO.read(getClass().getResource("/resources/images/NameOfImage.jpg"));
答案 1 :(得分:0)
请注意,jar文件包含在名为&#34; dist&#34;的目录中。通过NetBeans执行的根目录是&#34; dist&#34;的上层目录。因此,对文件路径的任何引用都将有所不同,具体取决于您是从NetBeans执行程序还是运行jar文件。
答案 2 :(得分:0)
由于您没有提及堆栈跟踪指向的确切位置(源+行号+方法),我认为它是:
g.drawImage(board.getBoardElement(j, i).getImage() ...
正如MadProgrammer所提到的,请使用Class.getResource
或Class.getResourceAsStream
阅读图片。
路径相对于类的包,或绝对"/...."
。重要的是,虽然Windows中的文件路径区分大小写,但在其他操作系统和jar中,它们区分大小写。
在g.dispose()
之后再拨打createGraphics
。 getGraphics
(与旧名称相同)。
Graphics g = bgg.getGraphics();
...
g.dispose();