gpt4 book ai didi

java - 为什么我切换机器后这段代码就停止工作了?

转载 作者:行者123 更新时间:2023-11-30 02:02:45 25 4
gpt4 key购买 nike

我使用 Eclipse 开发了一个 Java 项目,该项目需要加载一些图像并显示它们。起初,我这样加载它们:

InputStream stream = MyClass.class.getClass().getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);

无论我是从 Eclipse 还是从可执行 jar 运行它,它都运行得很好。但我最近买了一台新笔记本电脑,当我尝试在新机器上运行它时,jar 无法运行; stream 始终为 null。但是,当我从 Eclipse 内部运行时,不会出现此问题。

最后,经过一番实验,我将代码更改为直接在 MyClass.class 上调用 getResourceAsStream(),而不调用 getClass():

InputStream stream = MyClass.class.getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);

由于某种原因,它确实有效。我的新笔记本电脑具有与旧笔记本电脑相同的操作系统 (Windows 10) 和其他设置,但它运行 Eclipse Photon 而不是 Oxygen。

那么,这两种加载资源的方式有什么区别呢? (我听说这是关于类加载器的事情,但我不记得确切的词了。)为什么切换到新机器会破坏第一台机器?即使是第二个,我做得正确吗?

最佳答案

MyClass.class 返回表示类 MyClass 的 java.lang.Class 实例。调用 .getClass 会返回代表 java.lang.Class 本身的 Class 实例,并调用 getResourceAsStream 将尝试在 java.base 中查找资源(其中 >java.lang.Class 存在)。一般来说,不是你想要的。换句话说,您的第一个示例与 java.lang.Class.class.getResourceAsStream(...) 相同。

第二个例子是正确的方法。

第一件事在某些地方确实有效的原因是因为它取决于 Java SE 8 及更早版本中 Class.getResourceXXX 的具体指定方式。 Java SE 9 中的规范发生了变化,以处理类,其中类是命名模块。

关于java - 为什么我切换机器后这段代码就停止工作了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com