我用Java做了一个游戏。它在Eclipse中工作得非常好。
我把它导出为一个可运行的罐子。当双击它的图标时,它不会打开。所以我试着从命令行运行JAR。
在试图检索图像资源的一行代码中,我遇到了一个NullPointerException错误(正如我所说,它在Eclipse中工作得很好)。这是发生错误的代码行:
ball = new ImageIcon(this.getClass().getResource("sprites/ball.PNG"));
我不知道出了什么问题。这是我项目的结构:
有什么想法吗?我开始绝望了。
非常感谢你的帮助。
编辑:我尝试在sprites/ball的开头添加
。没有帮助。还尝试将/
。PNGPNG
更改为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>
编辑:我正在使用(默认软件包)这一事实可能是个问题吗?
您可以使用此加载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确保图像名称/路径与大小写完全匹配,因为它可能区分大小写。
您是否尝试过使用 /sprites/ball.PNG调用getResources
?
其他问题:您是否使用linux系统?如果是这样,您应该注意大写字母(ball.PNG与ball.PNG)。
编辑:
BufferedImage image = ImageIO.read(getClass().getResource("/sprites/ball.PNG"));
ImageIcon icon = new ImageIcon(image);
如果您使用存档工具查看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块来实现这一点?以下是我将如何使用单个资源来实现这一点: 我能想到的使用多个端口执行此操作的唯一方法如下: 有没有一种更简洁的方法来实现这一点,或者我提出的解决方案是否尽可能好?