java - 使用 ImageIO 读取 PNG 输入空异常
问题描述
我正在尝试为我的 Java 课程创建Pacman的基本实现,并创建了一个测试项目只是为了让运动正常工作(现在)。我将尝试JLabel
在面板上移动 a,并尝试将图标设置为JLabel
我已加载到项目中的 PNG 文件。PNG 文件位于名为Images的文件夹中,而我的所有其他类都位于同一项目的src文件夹中。当我尝试从src文件夹类中读取 PNG 文件时,出现以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400)
at pacman.<init>(pacman.java:16)
at screen.<init>(screen.java:9)
at driver.main(driver.java:6)
driver
创建一个screen
对象,然后创建一个对象pacman
,错误指向pacman
下面的类:
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class pacman {
Point pacLoc= new Point(0,0);
Direction pacDir=Direction.RIGHT;
int pacLives;
static int count=1;
int pacID;
BufferedImage pactest;
@SuppressWarnings("unused")
pacman(){
pacID=count;
switch(pacID) {
case 1:
try {
pactest=ImageIO.read(getClass().getResource("Images/lolface.png"));
} catch(IOException a1) {
a1.printStackTrace();
}
pacLoc.setLocation(100,100);
break;
case 2:
try {
pactest=ImageIO.read(getClass().getResource("Images/whyface.png"));
} catch(IOException a1) {
a1.printStackTrace();
}
pacLoc.setLocation(100,200);
break;
}
count++;
}
}
错误源于(我认为)ImageIO
没有找到 PNG 文件。我是否必须以某种方式将它们导入我的pacman
班级?在这种情况下,导入语法是什么?我应该提到我正在使用 Eclipse IDE,并且为了简单起见,我试图避免使用任何外部库。
编辑:
其他 2 个类目前并不太大,所以如果有帮助的话,我也可以在这里发布它们。
编辑2:
使用ImageIO.read(pacman.class.getResource("lolface.png"));
而不是Images/lolface.png
工作。谢谢!
解决方案
getClass().getResource()
是不正确的; 正确的语法是pacman.class.getResource(...)
你pacman
自己的类名*。
第二点,您的异常处理被破坏了。Exceptions 包含 4 个有用的东西(类型、消息、堆栈跟踪和因果链)。
你扔掉了 4 样东西中的 3 样。不要那样做;要么实际处理它(记录或打印错误不会处理它!),要么继续处理它(放在throws IOException
你的方法/构造函数签名上),或者如果这也不好,那就去吧,catch (Whatever e) { throw new RuntimeException(e); }
这不是很好,但很糟糕比e.printStackTrace()
。
您不必导入任何东西;import 是类型名称的别名(import com.foo.Bar;
意思是:这个文件中的任何地方都Bar
被写入并指示一个类型,想象它被读取com.foo.Bar
。它既不会将 Bar 类加载到内存中,也不会在其中运行任何代码,并且与资源无关)。
如果没有错误的堆栈跟踪,我们将无法帮助您。
如果在以 开头的行case 1
或以开头的行上是空指针异常case 2
,是的,这是因为找不到资源。
假设您修复了上述问题(pacman.class.getResource
而不是getClass().getResource
)并且这种情况仍在发生:getResource 的工作方式是它看起来相对于包含pacman.class
...的目录,即使所述类位于 jar 文件中。因此,如果您有 ,/home/BotFred/workspace/com.botfred.pacman/build/com/botfred/pacman/pacman.class
那么,它期望图像位于/home/BotFred/workspace/com.botfred.pacman/build/com/botfred/pacman/Images/lolface.png
。
如果你不太确定 pacman 类是从哪里加载的,你总是可以这样做来找出:
System.out.println(pacman.class.getResource("pacman.class"));
打印的结果将类似于file:///home/BotFred/workspace/com.botfred.pacman/build/com/botfred/pacman/pacman.class
或可能jar:file:///home/BotFred/pacman.jar!com/foo/botfred/pacman.class
(指示 jar 的位置,然后在其中,因为 jar 只是 zip 文件,位置;然后它会在 com/foo/botfred/Images/lolface 中查看该 jar。 png 为您的图像。
*) 原因是 getClass() 根据实例化对象的实际类型,而不是您正在查看的代码。所以,如果你子类化,事情就会破裂。或许 pacman 目前没有子类化,但目前有关键字。也许有一天会这样。要是突然断了就惨了 最好从一开始就学习好习惯;始终使用myclassname.class.getResource
,因为这与您要完成的任务相匹配(即:使用存储在与此代码所在的类文件相同的位置的资源)。
推荐阅读
- sql - 在 SQL Server 中的表上生成唯一的基于时间的 id
- flutter - 离开页面时执行代码
- javascript - 事件发生时连续换行
- react-native - react-native iterator typeof 符号错误
- javascript - Chrome 扩展 - 想要循环浏览 URL(如幻灯片)
- markdown - 降价中带有方程式和第二段的有序列表的正确缩进?
- android - 在不同类型的情况下更改图标通知
- python-3.x - 从 python 将 wav 转换为 mp3
- r - 在没有 github 的云服务器上创作 OpenCPU-Apps?
- javascript - 在 onSwitching 后从 react-swipeable-views 中删除元素