为什么此代码返回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
[1]永远不要使用getClass().getResource(...)
;而是使用MyClass.class.getResource()
; getClass()
变体可能会在子类上中断。这在swing应用程序中很少见,但是为什么在存在同样简单的“始终有效”方式时为什么要使用“通常有效”方式?
[2]您不能使用这样的点。传递给getResource
的字符串是以一种非常奇怪的方式进行解析的,将最后一个点以外的每个点都首先转换为斜杠,这在某种程度上使您编写Java外观的RetailStore.Images.product.png
的尝试有些误导。结果是您将其反转了,试图使java将斜杠转换为点。在实际实践中,getResource绝不会将斜杠转换为点,但始终将点转换为斜杠(最后一个点除外,因此对Windows / DOS风格的文件扩展名进行了硬编码)。该API既残破又怪异,但是在不破坏向后兼容性的情况下就无法修复,因此您必须处理这一问题。这意味着不可能使用getResource
从包含点的目录中读取文件。
因此,解决方案:
将RetailStore.Images
重命名为Images
,然后将Images
目录作为RetailStore
的子目录,以指示它们是'包含RetailStore图像的目录应用`,然后
用MyAccount.class.getResource("Images/product.png")
替换该呼叫。 (如果不是以斜杠开头,则相对于包含您的类文件的目录,这就是为什么这样做的原因。它也是最惯用和最易读的方式)。