【问题标题】:Why this doesn't appear to be initialized为什么这似乎没有被初始化
【发布时间】: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


【解决方案1】:

ss = new SpriteSheet(game.getSpriteSheet())被调用时,Game.spriteSheet成员似乎还没有被初始化,这是由Game.init()中的tex = new Textures(this)触发的。

奇怪的是,在Game.init() 中,spriteSheet 在调用new Texture(this) 之前被初始化。你能在Game.init() 中使用spriteSheet = loader.loadImage("/Sprite_Sheet.png") 的try/catch 块之后检查spriteSheet 是否为空。

【讨论】:

  • 其实问题可能出在loader.loadImage("/Sprite_Sheet.png");,其中loader是一个BufferedImageLoader。该方法必须构造并返回一个SpriteSheet(null)。您应该在该方法中添加一些检查。正如@turingcomplete 提到的,这可能是路径问题。
  • 我将如何解决这个问题? (对不起又犯傻了)啊对:S
  • 添加检查您是否已阅读文件的代码。一定有什么事情失败了,你得到了一个空值。我们不必为该方法编写代码。
  • 哦!我刚刚注意到:“/Sprite_Sheet.png”。前导斜线表示它将查看文件系统的根目录。
  • 对不起,忘了补充说我正在使用 Mac,在我尝试添加一些动画之前它已经工作了。 png 位于项目文件夹中名为“res”的文件中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2015-08-23
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2015-02-20
相关资源
最近更新 更多