Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在.jar文件中加载图像时出现NullPointerException_Java_Swing_Jar - Fatal编程技术网

Java 在.jar文件中加载图像时出现NullPointerException

Java 在.jar文件中加载图像时出现NullPointerException,java,swing,jar,Java,Swing,Jar,我正在eclipse中开发一个java项目。为了分发该程序,我通过eclipse中的导出函数创建了一个runnable.jar文件 在我的程序中,加载几个存储在名为“tableImages”文件夹中的图像。我通过类加载器加载图像(您可以在下面找到代码片段)。问题如下:当从.jar文件执行程序时,在上述文件夹中加载一个.png文件时,会抛出一个NullPointerException。现在有趣的是,完全相同文件夹中的一些.png文件被正确加载,这意味着它们不会导致NullPointerExcept

我正在eclipse中开发一个java项目。为了分发该程序,我通过eclipse中的导出函数创建了一个runnable.jar文件

在我的程序中,加载几个存储在名为“tableImages”文件夹中的图像。我通过类加载器加载图像(您可以在下面找到代码片段)。问题如下:当从.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;
         }

}

非常感谢你的帮助

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

此URL转换为文件系统中的绝对路径,这对于jar中的文件来说是无效路径。例如,如果您在bar.jar下有一个名为foo.png的文件,那么URL将是/path\u to\u current\u dir/bar.jar/!无效的foo.png。相反,您可以将文件作为流读取:

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

您可以使用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文件四处移动,并将imagefiles重命名到jar之外,所以我确定。

您是否也可以编辑抛出的异常及其stracktrace/log消息?这对查找错误非常有帮助:)请检查此项,或者您可以按照上面提到的步骤操作。谢谢,此链接也很有帮助!另一方面,这不起作用,顺便说一句:新建ImageIcon(Toolkit.getDefaultToolkit().getImage(path));我这样做的时候,效果非常好。非常感谢你的帮助。
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;
    }