現象:URL url = SwingAndThread.class.getResource("1.gif") 返回 null,導致 new ImageIcon(url) 拋出 NullPointerException。但 new ImageIcon("1.gif") 正常。
| 方式 | 查找基準 | 適用場景 |
|---|---|---|
Class.getResource("name") | **類文件所在包目錄** (classpath 根) | 打包進 JAR 的資源,**生產環境標準** |
ClassLoader.getResource("path") | **Classpath 根目錄** (src 根) | 跨包訪問資源 |
new ImageIcon("file.gif") | **當前工作目錄** (user.dir) | 僅開發環境有效,打包後失效 |
src 下非 Java 文件複製到 bin。bin/包名/。build.properties / Maven resources 插件複製資源。getResource("1.gif") 相對**當前類包**。若圖片在 src/images/1.gif,類在 com.example,需用:getResource("/images/1.gif") (從 classpath 根) 或 getResource("../images/1.gif") (相對包,不推薦)。1.GIF ≠ 1.gif。// 統一放在 src/resources/images/ (Maven) 或 src/images/ (Eclipse 默認源目錄)
// 類中使用絕對 classpath 路徑
URL url = SwingAndThread.class.getResource("/images/1.gif"); // 以 / 開頭表示 classpath 根
if (url == null) {
System.err.println("資源未找到: /images/1.gif");
return;
}
ImageIcon icon = new ImageIcon(url);
label.setIcon(icon);
// 列出 classpath 根下所有資源驗證
Enumeration urls = SwingAndThread.class.getClassLoader().getResources("images");
while (urls.hasMoreElements()) System.out.println(urls.nextElement());
掌握 Class.getResource 以類包為相對基準、ClassLoader.getResource 以 classpath 根為基準、文件路徑以工作目錄為基準的三大差異,並確保資源被正確編譯輸出,即可徹底解決空指針問題。