【问题标题】:URLImageSource is failing with Java 10 but not Java 8URLImageSource 在 Java 10 上失败,但在 Java 8 上失败
【发布时间】:2019-01-20 06:10:45
【问题描述】:

我的 Java 应用程序在 Java 8 上运行良好,但现在 Java 10 由于这条线而失败

setIconImage(Toolkit.getDefaultToolkit().createImage(Icon.class.getResource("/icon/songkong20.png")));

引用的图像存在并在使用 Java 8 时显示。

这会导致这个异常

java.lang.NullPointerException
    at java.desktop/sun.awt.image.URLImageSource.getConnection(URLImageSource.java:101)
    at java.desktop/sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:111)
    at java.desktop/sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:263)
    at java.desktop/sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:212)
    at java.desktop/sun.awt.image.ImageFetcher.run(ImageFetcher.java:176)

【问题讨论】:

  • 这是您看到的完整堆栈跟踪吗?任何相关的代码行?您是如何开始申请的?
  • @nullpointer 是完整的堆栈跟踪,但我现在找到了有问题的行,它有什么问题。
  • 啊,隐约记得一件事,如果我将 Icon.class 替换为我自己的类之一 SongKong.class 就可以了
  • Class.getResource 已在 Java9 中进行了修订,here you can read 更多关于模块的类加载器的影响以及如何找到资源。最好在 Class.getResource 方法中设置一个调试点,并在您的两个用例(Icon.classSongKong.class)中降级,您将能够自己查看不同的分辨率。
  • 与此相关的链接很少(可能重复),可能是onetwothree

标签: java class resources classloader java-10


【解决方案1】:

问题是我为模块中的文件调用 getResource(),但在系统类 (Icon.class) 上调用它,从 Java 9 开始不允许这样做。

变化

Icon.class.getResource("/icon/songkong20.png")));

SongKong.class.getResource("/icon/songkong20.png")));

修复了问题。

【讨论】:

  • 对,java.awt.Icon 在 java.desktop 模块中,所以 Icon.class.getResource(...) 将尝试在 java.desktop 模块中定位资源。相反,您应该在自己的模块中或至少在与类路径上的代码相同的 JAR 文件中找到资源,因此将其更改为您自己的类是正确的做法。
猜你喜欢
  • 1970-01-01
  • 2018-12-27
  • 2011-10-05
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多