我对Java SE Swing应用程序有疑问。它在Java 8和11上都可以正常编译,但在以下几行中不能在Java 8和11上失败:
URL url = Object.class.getResource("/org/mozillatranslator/resource/mt_icon_small.gif");
Toolkit tk = Toolkit.getDefaultToolkit();
Image img = tk.getImage(url); // Raises runtime exception
例外:
Caused by: java.lang.NullPointerException
at java.desktop/sun.awt.SunToolkit.getImageFromHash(SunToolkit.java:653)
at java.desktop/sun.awt.SunToolkit.getImage(SunToolkit.java:689)
at org.mozillatranslator.gui.MainWindow.loadIcon(MainWindow.java:232)
正如我已经说过的,该行适用于Java 8,但在具有完全相同的JAR的Java 11上失败。我已经搜索了版本8以上的Java行为更改,但没有发现任何东西。是否有人遇到过类似情况,或者可以提出任何可能的解决方法?
使用
URL url = <YourClassName>.class.getResource("/org/mozillatranslator/resource/mt_icon_small.gif");
或
URL url = Thread.currentThread()
.getContextClassLoader()
.getResource("org/mozillatranslator/resource/mt_icon_small.gif");
[Object
是loaded by bootstrap class loader,所以Object.class.getResource()
使用system class loader。
使用空字符串参数检查返回值; Object.class.getResource("")
,YourClass.class.getResource("")
和Thread.currentThread().getContextClassLoader().getResource("")
。
tk.getImage(url)
中的NPE正在发生,因为url
为null
。
url
为null
是因为getResource(String)
返回null
in
Object.class.getResource(".../mt_icon_small.gif");
它返回null
,因为Object
类的类加载器找不到该资源。根据javadoc,getResource(String)
...
“ Returns:
URL
对象或null
,如果找不到具有该名称的资源。”
在Java 11中,Object
的class.loader是引导程序类加载器,而您的应用程序JAR不在引导程序类加载器的类路径上。
纠正此问题的方法是使用正确的类加载器;即加载您的应用程序类的类加载器。例如:
URL url = YourMainClass.class.getResource(".../mt_icon_small.gif");
这适用于所有Java版本。