java - 为什么这似乎没有初始化

标签 java error-handling nullpointerexception bufferedimage

我有一个典型的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;

}

我已经看过了本类(class)的所有内容,这是该类(class):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(),就在其中...)
  • Game.class
     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);
    


  • 如果您需要我展示另一门课,我会很乐意这样做,因为最大(也是唯一)的是Game

    **编辑:**这是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,但显然不正确,因此我使用其他图像编辑器将其打开并再次导出。

    最佳答案

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

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

    关于java - 为什么这似乎没有初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702089/

    相关文章:

    java - 如何使用utf-8导出Excel CSV并读入Java?

    Java 方法未在 if 语句中求值

    linux - 在 Bash 脚本中设置 -e : discovering failure location?

    java - 客户端站点上没有为 NullPointerException 生成堆栈跟踪吗?

    java - 如何修复 JAXB 上下文的 newInstance 中的 nullPointerException

    java - 什么是NullPointerException,我该如何解决?

    java - Thymeleaf:如何使用条件来动态添加/删除 CSS 类

    java - 如何从 eclipse-plugin 中的代码中选择 TreeView 节点

    java - Java libGdx : FreeTypeFontGenerator is not working (Black screen)

    python - read() 后无法读取 urllib 错误消息