Jar 文件不像在 NetBeans 中那样工作
Jar file don't works like in NetBeans
我的 jar 文件有问题。当我在 NetBeans 中运行项目时,一切正常。但是当我将它作为一个 jar 文件运行时,我在这个函数中遇到了空指针异常:
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 变量运行应用程序时,当出现 NullPointerException 时,i 和 j 具有不同的值。可能是什么原因?
首先在您的代码中添加一些调试语句(System.out.println
或使用像 log4j 或内置日志记录 API 这样的日志记录 API)来检查各种变量的状态和确定代码的 运行 顺序。
在您的代码中添加断点并使用调试器逐步执行您的代码并检查各种变量的状态和代码逻辑。
我 "guess" 你得到一个异常,因为 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"));
注意 jar 文件包含在名为 "dist" 的目录中,其中通过 NetBeans 执行的根目录是 "dist" 的上层目录。因此,对文件路径的任何引用都会有所不同,具体取决于您是从 NetBeans 还是从 运行 jar 文件执行程序。
因为你没有提到确切的位置,堆栈跟踪将指向一个列表(来源+行号+方法),我假设它是:
g.drawImage(board.getBoardElement(j, i).getImage() ...
正如 MadProgrammer 提到的,使用 Class.getResource
或 Class.getResourceAsStream
阅读图像。
路径是相对于 class 的包,或绝对 "/...."
。重要的是,尽管 Windows 中的文件路径区分大小写,但在其他操作系统和 jar 中它们区分大小写。
也在 createGraphics
之后调用 g.dispose()
。 getGraphics
(相同,但名称较旧)。
Graphics g = bgg.getGraphics();
...
g.dispose();
我的 jar 文件有问题。当我在 NetBeans 中运行项目时,一切正常。但是当我将它作为一个 jar 文件运行时,我在这个函数中遇到了空指针异常:
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 变量运行应用程序时,当出现 NullPointerException 时,i 和 j 具有不同的值。可能是什么原因?
首先在您的代码中添加一些调试语句(System.out.println
或使用像 log4j 或内置日志记录 API 这样的日志记录 API)来检查各种变量的状态和确定代码的 运行 顺序。
在您的代码中添加断点并使用调试器逐步执行您的代码并检查各种变量的状态和代码逻辑。
我 "guess" 你得到一个异常,因为 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"));
注意 jar 文件包含在名为 "dist" 的目录中,其中通过 NetBeans 执行的根目录是 "dist" 的上层目录。因此,对文件路径的任何引用都会有所不同,具体取决于您是从 NetBeans 还是从 运行 jar 文件执行程序。
因为你没有提到确切的位置,堆栈跟踪将指向一个列表(来源+行号+方法),我假设它是:
g.drawImage(board.getBoardElement(j, i).getImage() ...
正如 MadProgrammer 提到的,使用 Class.getResource
或 Class.getResourceAsStream
阅读图像。
路径是相对于 class 的包,或绝对 "/...."
。重要的是,尽管 Windows 中的文件路径区分大小写,但在其他操作系统和 jar 中它们区分大小写。
也在 createGraphics
之后调用 g.dispose()
。 getGraphics
(相同,但名称较旧)。
Graphics g = bgg.getGraphics();
...
g.dispose();