使用 ImageIO 输入空异常读取 PNG
reading PNG using ImageIO input null exception
我正在尝试为我的 Java 课程创建 Pacman 的基本实现,并创建了一个测试项目来让运动正常工作(目前).我将尝试在面板上移动 JLabel
,并尝试将 JLabel
的图标设置为我已加载到项目中的 PNG 文件。 PNG 文件位于名为 Images 的文件夹中,我所有其他 classes 都位于同一项目的 src 文件夹中。当我尝试从 src 文件夹 classes 中读取 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
class:
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
class?在那种情况下,导入语法是什么?我应该提到我正在使用 Eclipse IDE 并且为了简单起见我试图避免使用任何外部库。
编辑:
另外 2 个 class 目前还不算太大,所以如果有帮助的话,我也可以 post 它们在这里。
编辑 2:
使用 ImageIO.read(pacman.class.getResource("lolface.png"));
代替 Images/lolface.png
是可行的。谢谢!
getClass().getResource()
不正确;正确的语法是 pacman.class.getResource(...)
其中 pacman
是您自己的 classname*.
第二点,你的异常处理有问题。异常包含 4 个有用的东西(类型、消息、堆栈跟踪和因果链)。
你扔掉了 4 件东西中的 3 件。不要那样做;要么实际处理它(记录或打印错误 NOT 处理它!),要么继续处理它(将 throws IOException
放在你的 method/constructor 签名上),或者如果那也不好,请选择 catch (Whatever e) { throw new RuntimeException(e); }
,这不是很好,但比 e.printStackTrace()
.
好很多。
您不必导入任何东西; import 是类型名称的别名(import com.foo.Bar;
意思是:任何时候在这个文件的任何地方写入 Bar
并指示一种类型,想象它读取 com.foo.Bar
代替。它既不加载 Bar class进入内存,也不在其中运行任何代码,与资源无关。
没有错误的堆栈跟踪,我们无法帮助您。
IF在case 1
开头的行或者case 2
开头的行出现空指针异常,是的,是因为资源是未找到。
假设您解决了上述问题(pacman.class.getResource
而不是 getClass().getResource
)并且这种情况仍在发生:getResource 的工作方式是它看起来相对于包含 pacman.class
的目录...即使说 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 class 是从哪里加载的,您可以随时这样做来找出答案:
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.png 的那个罐子里寻找你的图片。
*) 原因是 getClass() 根据实例化对象的实际类型,而不是您正在查看的代码。所以,如果你 subclass,事情就坏了。也许 pacman 目前没有被 subclassed,但是关键字目前有。也许有一天它是。要是突然坏掉就糟了。最好从一开始就养成好习惯;始终使用 myclassname.class.getResource
因为它与您要完成的目标相匹配(即:使用与存储此代码的 class 文件存储在同一位置的资源)。
我正在尝试为我的 Java 课程创建 Pacman 的基本实现,并创建了一个测试项目来让运动正常工作(目前).我将尝试在面板上移动 JLabel
,并尝试将 JLabel
的图标设置为我已加载到项目中的 PNG 文件。 PNG 文件位于名为 Images 的文件夹中,我所有其他 classes 都位于同一项目的 src 文件夹中。当我尝试从 src 文件夹 classes 中读取 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
class:
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
class?在那种情况下,导入语法是什么?我应该提到我正在使用 Eclipse IDE 并且为了简单起见我试图避免使用任何外部库。
编辑:
另外 2 个 class 目前还不算太大,所以如果有帮助的话,我也可以 post 它们在这里。
编辑 2:
使用 ImageIO.read(pacman.class.getResource("lolface.png"));
代替 Images/lolface.png
是可行的。谢谢!
getClass().getResource()
不正确;正确的语法是 pacman.class.getResource(...)
其中 pacman
是您自己的 classname*.
第二点,你的异常处理有问题。异常包含 4 个有用的东西(类型、消息、堆栈跟踪和因果链)。
你扔掉了 4 件东西中的 3 件。不要那样做;要么实际处理它(记录或打印错误 NOT 处理它!),要么继续处理它(将 throws IOException
放在你的 method/constructor 签名上),或者如果那也不好,请选择 catch (Whatever e) { throw new RuntimeException(e); }
,这不是很好,但比 e.printStackTrace()
.
您不必导入任何东西; import 是类型名称的别名(import com.foo.Bar;
意思是:任何时候在这个文件的任何地方写入 Bar
并指示一种类型,想象它读取 com.foo.Bar
代替。它既不加载 Bar class进入内存,也不在其中运行任何代码,与资源无关。
没有错误的堆栈跟踪,我们无法帮助您。
IF在case 1
开头的行或者case 2
开头的行出现空指针异常,是的,是因为资源是未找到。
假设您解决了上述问题(pacman.class.getResource
而不是 getClass().getResource
)并且这种情况仍在发生:getResource 的工作方式是它看起来相对于包含 pacman.class
的目录...即使说 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 class 是从哪里加载的,您可以随时这样做来找出答案:
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.png 的那个罐子里寻找你的图片。
*) 原因是 getClass() 根据实例化对象的实际类型,而不是您正在查看的代码。所以,如果你 subclass,事情就坏了。也许 pacman 目前没有被 subclassed,但是关键字目前有。也许有一天它是。要是突然坏掉就糟了。最好从一开始就养成好习惯;始终使用 myclassname.class.getResource
因为它与您要完成的目标相匹配(即:使用与存储此代码的 class 文件存储在同一位置的资源)。