【发布时间】:2014-11-02 17:15:33
【问题描述】:
我有一个典型的 NullPointerException:
Exception in thread "Thread-0" java.lang.NullPointerException
at com.game.main.SpriteSheet.grabImage(SpriteSheet.java:17)
at com.game.main.Textures.getTextures(Textures.java:30)
at com.game.main.Textures.<init>(Textures.java:21)
at com.game.main.Game.init(Game.java:80)
at com.game.main.Game.run(Game.java:116)
at java.lang.Thread.run(Thread.java:745)
我很确定我知道 null 在哪里,我认为是这个方法(这也是 getImage 方法加载到我创建的 spritesheet.png 图像中你想要的任何网格中)
public BufferedImage grabImage(int column, int row, int width, int height){
System.out.println("img is " + image); //<<<< How I tested for null.. May not be the best way, but image said to be null
BufferedImage img = image.getSubimage((column * 32) - 32, (row * 32) - 32, width, height);
return img;
}
我查看了这个类的所有内容,这是类:SpiteSheet.class
package com.game.main;
import java.awt.image.BufferedImage;
public class SpriteSheet {
private BufferedImage image;
public SpriteSheet(BufferedImage image){
this.image = image;
System.out.println("img is " + this.image); // <<<<<<<<< THIS ONE SHOWS "img is nullException in thread "Thread-0" " in the console
}
public BufferedImage grabImage(int column, int row, int width, int height){
System.out.println("img is " + image); //<<<< How I tested for null.. May not be the best way, but image said to be null
BufferedImage img = image.getSubimage((column * 32) - 32, (row * 32) - 32, width, height);
return img;
}
}
我想知道我将如何启动它?虽然我猜它已经是 image.getSubimage(code),但我测试了 this.image,它说,那就是 NullPointerException……但它应该已经启动了。
可能涉及的更多类
-
Textures.class
package com.game.main; import java.awt.image.BufferedImage; public class Textures { public BufferedImage[] player = new BufferedImage[3]; public BufferedImage[] missile = new BufferedImage[3]; public BufferedImage[] enemy = new BufferedImage[3]; private SpriteSheet ss; private Game game; public Textures(Game game){ this.game = game; ss = new SpriteSheet(game.getSpriteSheet()); getTextures(); // This is line 21 } public void getTextures(){ player[0] = ss.grabImage(1, 1, 32, 32); //This is line 30 player[1] = ss.grabImage(1, 2, 32, 32); player[2] = ss.grabImage(1, 3, 32, 32); missile[0] = ss.grabImage(2, 1, 32, 32); missile[1] = ss.grabImage(2, 2, 32, 32); missile[2] = ss.grabImage(2, 3, 32, 32); enemy[0] = ss.grabImage(3, 1, 32, 32); enemy[1] = ss.grabImage(3, 2, 32, 32); enemy[2] = ss.grabImage(3, 3, 32, 32); }}
game.class 非常大,所以我将给出它所说的涉及它的主要方法(明白吗?init(),在其中...)
-
游戏类
public void init(){ requestFocus(); //Brings focus to the screen at the start BufferedImageLoader loader = new BufferedImageLoader(); try{ spriteSheet = loader.loadImage("/Sprite_Sheet.png"); background = loader.loadImage("/Background.png"); }catch(IOException e){ e.printStackTrace(); } addKeyListener(new KeyInput(this)); tex = new Textures(this); p = new Player(300,300, tex); c = new Controller(tex); ea = c.getEntityA(); eb = c.getEntityB(); c.createEnemy(enemyCount);}
如果您需要我展示其他课程,我会很乐意这样做,因为最大和唯一的大(ish)课程是游戏
**编辑:** 这是 getSpriteSheet 方法
`public BufferedImage getSpriteSheet(){ return spriteSheet; }`
**EDIT1: ** 这是 BufferedImageLoader 类
package com.game.main;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class BufferedImageLoader {
private BufferedImage image;
public BufferedImage loadImage(String path) throws IOException{
image = ImageIO.read(getClass().getResource(path));
return image;
}
}
**EDIT2:**当我尝试从一开始就对其进行路径时,我只是收到此错误,我认为我在路径时也没有犯错误。所以我把它保存为 /Sprite_Sheet.png;
Exception in thread "Thread-0" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1388)
at com.game.main.BufferedImageLoader.loadImage(BufferedImageLoader.java:14)
at com.game.main.Game.init(Game.java:72)
at com.game.main.Game.run(Game.java:117)
at java.lang.Thread.run(Thread.java:745)
**EDIT3: ** 我检查了它是否只是 spriteSheet 加载了 null 的东西,而且背景没有返回 null
**找到答案:**我格式错误,虽然是 PNG,但显然不正确,所以我用不同的图像编辑器打开它并再次导出。
【问题讨论】:
-
能发一下getSpriteSheet方法吗?
-
@turingcomplete 这是在游戏类中 public BufferedImage getSpriteSheet(){ return spriteSheet; }
-
您能编辑您的帖子并将代码放在那里吗? cmets 中的代码有点不可读。
-
@turingComplete 对不起,我的错。忘了
-
我说的是 BufferedImageLoader 类。我怀疑您输入了错误的图像路径,BufferedImageLoader 类找不到它,因此图像被设置为 null。
标签: java error-handling nullpointerexception bufferedimage