image
的类型为 BufferedImage
public void loadImage(String fileImage) {
URL imageurl = getClass().getResource(fileImage);
File input = null;
try {
input = new File(imageurl.toURI());
image = ImageIO.read(imageurl);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Unknown error has occurred!", "Unknown error", JOptionPane.ERROR_MESSAGE);
}
}
这是我在程序中调用它的方式:
loadImage("./Images/Cover.png");
图像文件恰好位于:
C:\Users\S\Google Drive\NetBeansProjects\DictionaryShorten\src\dic\Images
DictionaryShorten.java 文件位于:
C:\Users\S\Google Drive\NetBeansProjects\DictionaryShorten\src\dic
单击选项“清理并构建”后,images文件夹将包含在DictionaryShorten.jar中;这意味着图像成为 jar 文件的一部分。
该程序在 NetBeanse IDE 中运行正常,但当我从 DictionaryShorten.jar 文件运行它时,它抛出异常!!!
如何修改loadImage(String)
以使DictionaryShorten.jar文件可以在任何地方运行?
最佳答案
Class.getResource 的参数不是文件名。它是一个相对 URL,相对于每个类路径条目(例如 .jar 文件)的根。
从字符串参数中删除句点 (.
)。
此外,.jar 文件中的条目不是实际文件,因此 new File(imageurl.toURI())
始终会失败。您应该删除该行代码。 (看来您无论如何都不需要它。)
应该注意的是,异常非常有值(value)。它们会告诉您出了什么问题以及出问题的位置。您会发现,如果在对话框中显示异常,问题就更容易解决:
JOptionPane.showMessageDialog(null, "Unknown error has occurred:\n\n" + e,
"Unknown error", JOptionPane.ERROR_MESSAGE);
比这更好的是显示完整的堆栈跟踪:
StringWriter stackTrace = new StringWriter();
e.printStackTrace(new PrintWriter(stackTrace));
JTextArea stackTraceField = new JTextArea(stackTrace.toString(), 12, 40);
stackTraceField.setEditable(false);
JOptionPane.showMessageDialog(null,
new Object[] {
"Unknown error has occurred.", new JScrollPane(stackTraceField)
},
"Unknown error", JOptionPane.ERROR_MESSAGE);
堆栈跟踪准确地告诉您哪一行代码导致了异常。
关于java - 什么代码能够读取program.jar应用程序文件中包含的图像;从任何地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068323/