ImageIcon上的NullPointerException

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

为什么此代码返回NullPointerException

ProductLogo = new javax.swing.JLabel();
ProductLogo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/RetailStore/Images/product.png")));

我的目录是

ProjectABC
    |
    |---Source Packages
            |
            |---RetailStore
            |        |
            |        |---MyAccount.java // Current class I'm in with the code above
            |
            |---RetailStore.Images
                     |
                     |---product.png
java jlabel imageicon
1个回答
0
投票

[1]永远不要使用getClass().getResource(...);而是使用MyClass.class.getResource(); getClass()变体可能会在子类上中断。这在swing应用程序中很少见,但是为什么在存在同样简单的“始终有效”方式时为什么要使用“通常有效”方式?

[2]您不能使用这样的点。传递给getResource的字符串是以一种非常奇怪的方式进行解析的,将最后一个点以外的每个点都首先转换为斜杠,这在某种程度上使您编写Java外观的RetailStore.Images.product.png的尝试有些误导。结果是您将其反转了,试图使java将斜杠转换为点。在实际实践中,getResource绝不会将斜杠转换为点,但始终将点转换为斜杠(最后一个点除外,因此对Windows / DOS风格的文件扩展名进行了硬编码)。该API既残破又怪异,但是在不破坏向后兼容性的情况下就无法修复,因此您必须处理这一问题。这意味着不可能使用getResource从包含点的目录中读取文件。

因此,解决方案:

  1. RetailStore.Images重命名为Images,然后将Images目录作为RetailStore的子目录,以指示它们是'包含RetailStore图像的目录应用`,然后

  2. MyAccount.class.getResource("Images/product.png")替换该呼叫。 (如果不是以斜杠开头,则相对于包含您的类文件的目录,这就是为什么这样做的原因。它也是最惯用和最易读的方式)。

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