当前位置: 首页 > 知识库问答 >
问题:

在.jar文件中加载图像时的空指针异常

瞿子濯
2023-03-14

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

在我的程序中,加载存储在名为“tableImages”的文件夹中的多个图像。我通过类加载器加载图像(您将在下面找到代码片段)。问题如下:从.jar文件执行程序时,在加载上述文件夹中的.png文件之一时,它会抛出 NullPointerException。现在有趣的是,完全相同文件夹中的一些.png文件被正确加载,这意味着它们不会导致NullPointerException。

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

这是我在摇摆架上绘制图像的类。

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;
         }

}

非常感谢您的帮助!

共有3个答案

席嘉祯
2023-03-14

你可以使用一个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 之外,所以我确定。

公羊嘉
2023-03-14

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

田骁
2023-03-14
URL url = ClassLoader.getSystemResource(image);

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

InputStream is = getClass().getClassLoader().getResourceAsStream(image);
ImageIO.read(is);
 类似资料:
  • 我正在尝试从可执行JAR文件加载图像。 我跟踪了这里的信息,然后是这里的信息。 这是检索图像的函数: 这就是它的名称: 这是一个简单的对象。我也不会得到NullPointerException,除非它被UI屏蔽。 我检查了JAR文件,图像位于: /图片/标识1。巴布亚新几内亚 当前代码在eclipse中以及导出到JAR并在终端中运行时都有效,但在双击JAR时不起作用,在这种情况下,图标是默认的JF

  • 我将StackPane作为根,并在主应用程序Start()方法中加载了BorderPane布局。在BorderPane布局中,我有两个按钮:一个用于添加fxml文件(Menu.fxml),另一个用于删除此文件。一旦菜单。fxml已加载,菜单中有一个按钮。fxml,单击时应在先前加载的BorderPane布局的中心加载一个fxml文件(One.fxml)。然而,在这个阶段,我得到了一个空指针异常。你

  • 我正在尝试结合使用Struts2和Spring上传文件。但是,在到达action类之后,我的文件、和文件内容类型都显示为。我试图寻找问题,但没有结果。下面是我上传文件的代码。 : Struts.xml applicationContext-web.xml 管理上传动作 磁贴.xml Result.jsp

  • 问题内容: 我目前正在编写一个程序,需要以jar形式发送给朋友。该程序具有需要加载的图像,以便程序正常运行,我希望所有图像都包含在一个jar中。目前,它无法从可执行jar或通过命令行运行时运行。它可以在netbeans中工作。 这是我正在使用的代码: 要加载我正在使用的图像: 对于我也尝试过的网址 应该在其中创建图像的行是: 我的jar文件设置为在其顶层包含类文件的文件夹和资源文件夹。 我一直在寻

  • 我是Apache Camel的新手,正在尝试构建api。它有三个类。 A类-这是为了读取下面application.properties文件 B类-阿帕奇骆驼路线。 类C-Bean类,其中类A是自动连接的。 每当IDE执行api时,它都会在行中抛出Null指针异常。getUsername() 。我已经验证了spring boot能够加载应用程序。属性。 我不确定为什么调用自动加载类的方法会抛出空指

  • 08-0712:11:44.453:I/Choreographer(1257):跳过126帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:46.313:I/Choreographer(1257):跳过了131帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:48.033:I/Choreographer(1257):跳过了33个帧! 应用程序可能在主线程上做了太多的