【问题标题】:NullPointerException when loading images in .jar-file在 .jar 文件中加载图像时出现 NullPointerException
【发布时间】:2012-05-21 00:10:20
【问题描述】:

我正在 Eclipse 中开发一个 java 项目。为了分发程序,我通过 eclipse 中的导出功能创建了一个可运行的 .jar 文件。

在我的程序中,加载了几个存储在名为“tableImages”的文件夹中的图像。我通过 ClassLoader 加载图像(您将在下面找到代码 sn-ps)。问题如下:从 .jar 文件执行程序时,在上述文件夹中加载其中一个 .png 文件时会引发 NullPointerException。现在有趣的是,完全相同的文件夹中的某些 .png 文件已正确加载,这意味着它们不会导致 NullPointerException。

我使用 jar tf 命令检查了 .jar 的内容。显然无法加载的图像被打包到罐子里。那么是什么导致了这个 NullPointerException,我该如何解决呢?

这是我用来将图像绘制到摆动框架的类。

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class LoadBackgroundImage extends Component {

    private static final long serialVersionUID = 1L;

    BufferedImage img;

    public void paint(Graphics g){
        g.drawImage(img, 0, 0, null);
    }

    public LoadBackgroundImage(String image){
        URL url = ClassLoader.getSystemResource(image);
        try{
            img = ImageIO.read(url);
            this.setSize(img.getWidth(), img.getHeight());
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public Dimension getPreferredSize(){
        if(img == null){
            return new Dimension(100, 100);
        }else{
            return new Dimension(img.getWidth(null), img.getHeight(null));
        }
    }

    public BufferedImage getImage(){
          return img;
         }

}

非常感谢您的帮助!

【问题讨论】:

  • 您能否在抛出的异常中进行编辑,它是 stracktrace/log 消息?这对查找错误非常有帮助:)
  • 检查这个HOW TO ADD IMAGES TO YOUR PROJECT IN ECLIPSE或者你可以按照提到的步骤here
  • 谢谢,这个链接也很有帮助!

标签: java swing jar


【解决方案1】:

假设该文件确实在 .jar 包中,原因很可能是 .jar 文件中的条目是在区分大小写的情况下加载的,因此foo.png 相同作为Foo.png。当您从常规文件加载时,行为取决于文件系统,因此在 Windows 和 Mac 上 foo.pngFoo.png 将表示相同的文件(!)。

【讨论】:

    【解决方案2】:
    URL url = ClassLoader.getSystemResource(image);
    

    此 URL 转换为文件系统中的绝对路径,这将是 jar 中文件的无效路径。例如,如果您在 bar.jar 下有一个名为 foo.png 的文件,则 URL 将为 /path_to_current_dir/bar.jar/!foo.png,这是无效的。相反,您可以将文件作为流读取:

    InputStream is = getClass().getClassLoader().getResourceAsStream(image);
    ImageIO.read(is);
    

    【讨论】:

    • 当我这样做的时候效果很好。非常感谢您的帮助。
    【解决方案3】:

    你可以使用一个 URL,我自己试过了,效果很好,从 jar 中获取 png 文件:

    这是我使用的代码:

    public static ImageIcon getIcon(String path)
        {
            String imageFile = "";
    
            if(path.equals(""))
                imageFile = "/Images/Icon.png";
            else
                imageFile = path;
    
            URL source = Messages.class.getResource(imageFile);
            if(source != null)
            {
                ImageIcon imageIcon = new ImageIcon(source);
                return imageIcon;
            }
            return null;
        }
    

    然后我将它直接添加到 JLabel 中,就像一个魅力一样,我还移动了 jar 文件并将图像文件重命名到 jar 之外,所以我确定。

    【讨论】:

    • 另一方面,这不起作用:new ImageIcon(Toolkit.getDefaultToolkit().getImage(path));
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2017-02-15
    • 2011-11-14
    • 2016-03-30
    相关资源
    最近更新 更多