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

尝试使用图像资源时出现NullPointerException

邢飞白
2023-03-14

我用Java做了一个游戏。它在Eclipse中工作得非常好。

我把它导出为一个可运行的罐子。当双击它的图标时,它不会打开。所以我试着从命令行运行JAR。

在试图检索图像资源的一行代码中,我遇到了一个NullPointerException错误(正如我所说,它在Eclipse中工作得很好)。这是发生错误的代码行:

ball = new ImageIcon(this.getClass().getResource("sprites/ball.PNG"));

我不知道出了什么问题。这是我项目的结构:

有什么想法吗?我开始绝望了。

非常感谢你的帮助。

编辑:我尝试在sprites/ball的开头添加/。PNG。没有帮助。还尝试将PNG更改为png。也不起作用。

在JAR内部检查,图像在里面。我在Windows上。

这是stacktrace:

Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init><Unknown Source>
    at instPanel.<init><instPanel.java:17>
    at Main.<init><Main.java:23>
    at Main.main<Main.java:38>

编辑:我正在使用(默认软件包)这一事实可能是个问题吗?

共有3个答案

鱼锦
2023-03-14

您可以使用此加载URL。getClass()。getResource(“sprites/ball.PNG”)但它返回:“一个java.net.URL对象,如果找不到具有此名称的资源,则返回null”。

因此,来自ImageIcon(URL位置)的构造函数的值为null,如果查看构造函数,您将看到以下行:this(location,location.toExternalForm())

问题在于位置为空的精确行,因此<代码>位置。toExternalForm()抛出您的NPE。

你可以用

image = this.getClass().getResource("sprites/ball.PNG");
if (image != null) { 
    ball = new ImageIcon(image); 
}

但潜在的问题是找不到图像。

您可以找到(并修复)错误:

1在某处打印它将查找的路径:

URL resource = this.getClass().getResource("/");
resource.getFile(); // print me somehwere

URL resource = this.getClass().getResource("img/");
resource.getFile(); // print me as well

URL resource = this.getClass().getResource("img/ball.PNG");
resource.getFile(); // print me as well

2确保图像名称/路径与大小写完全匹配,因为它可能区分大小写。

商冠玉
2023-03-14

您是否尝试过使用 /sprites/ball.PNG调用getResources

其他问题:您是否使用linux系统?如果是这样,您应该注意大写字母(ball.PNG与ball.PNG)。

编辑:

BufferedImage image = ImageIO.read(getClass().getResource("/sprites/ball.PNG"));
ImageIcon icon = new ImageIcon(image);
汪庆
2023-03-14

如果您使用存档工具查看jar内部,它应该是这样的。

JARROOT/*.class
JARROOT/sprites/ball.png

您可以尝试以下操作。

在Eclipse中右键单击sprites文件夹。单击构建路径-

您对资源的调用应该是this。getClass()。getResource(“/精灵/球.png”) 或<代码>此。getClass()。getResource(“/ball.png”) 取决于Eclipse如何打包jar。

编辑:请阅读文档。

如果传递给getResource(“”)的字符串以“/”开头,它将被视为jar中的绝对路径。如果字符串开头没有“/”,它将被视为类的相对路径。

下面是一个带有注释的简单项目的图像。“图标”文件夹是一个资源文件夹。它的内容将被打包在罐子里。在这种情况下,JARROOT/其他/缩小图标。JPG和JARROOT/放大图标。jpg。

 类似资料:
  • 错误:/io/opencv/modules/highgui/src/window。cpp:583:错误:(-2)未实现该函数。使用Windows、GTK 2重建库。x或碳载体。如果您使用的是Ubuntu或Debian,请安装libgtk2。0-dev和pkg config,然后在函数cvShowImage中重新运行cmake或配置脚本

  • 我得到这个问题: 这就是它指向的地方 我正在尝试制作一个后端有express,前端有Webpack的应用程序。我在后端有一个Rest API,不能在前端使用。 我将Ubuntu与Mozilla Firefox 66.0.2和Nodejs 11.13.0结合使用 当我使用控制台时,它说问题出在它上面

  • 我尝试在桌面应用程序中加载图像,但我不知道图像的路径 错误: 线程“AWT-EventQueue-0”java.lang.NullPointerException在javax.swing.ImageIcon处出现异常。(未知源)在Ventanas.Success处。(success.java:30)

  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall

  • 我知道,如果资源已实现自动关闭,您通过尝试传递的资源将自动关闭。到现在为止,一直都还不错。但是,当我有几个我想要自动关闭的资源时,我该怎么办呢。带插座的示例; 所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但是输入和输出应该如何正确关闭呢?

  • 我需要打开N个多播套接字(其中N来自参数列表的大小)。然后,我将向循环中的N个套接字中的每个套接字发送相同的数据,最后关闭每个套接字。我的问题是,如何使用try with resources块来实现这一点?以下是我将如何使用单个资源来实现这一点: 我能想到的使用多个端口执行此操作的唯一方法如下: 有没有一种更简洁的方法来实现这一点,或者我提出的解决方案是否尽可能好?