Toolkit.getImage(URL url)适用于Java 8,但不适用于Java 11

问题描述 投票:0回答:2

我对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行为更改,但没有发现任何东西。是否有人遇到过类似情况,或者可以提出任何可能的解决方法?

java java-8 nullpointerexception embedded-resource java-11
2个回答
2
投票

使用

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");

[Objectloaded by bootstrap class loader,所以Object.class.getResource()使用system class loader

使用空字符串参数检查返回值; Object.class.getResource("")YourClass.class.getResource("")Thread.currentThread().getContextClassLoader().getResource("")


0
投票

tk.getImage(url)中的NPE正在发生,因为urlnull

urlnull是因为getResource(String)返回null in

Object.class.getResource(".../mt_icon_small.gif");

它返回null,因为Object类的类加载器找不到该资源。根据javadocgetResource(String) ...

Returns: URL对象null,如果找不到具有该名称的资源。”

在Java 11中,Object的class.loader是引导程序类加载器,而您的应用程序JAR不在引导程序类加载器的类路径上。

纠正此问题的方法是使用正确的类加载器;即加载您的应用程序类的类加载器。例如:

URL url = YourMainClass.class.getResource(".../mt_icon_small.gif");

这适用于所有Java版本。

© www.soinside.com 2019 - 2024. All rights reserved.