2014-11-02 123 views
0

我有一個典型的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) 

,我敢肯定,我知道空是的,我認爲這是這個方法(同樣,這是的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(代碼),我測試了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); 
    

    }

如果你需要我展示另一個類,我會很高興,因爲最大的和唯一的大這樣做( 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加載,它是,背景沒有給回空

**找到了答案:**我將其格式錯誤,雖然它是PNG,但它顯然不對,所以我用另一個圖像編輯器打開它並再次導出它。

+0

你可以發佈getSpriteSheet方法嗎? – turingcomplete 2014-11-02 17:55:53

+0

現在會做:) s – BiblyDoo 2014-11-02 17:58:48

+0

@turingcomplete這是在遊戲類public BufferedImage getSpriteSheet(){ \t \t返回spriteSheet; \t} – BiblyDoo 2014-11-02 17:59:24

回答

0

看起來像Game.spriteSheetss = new SpriteSheet(game.getSpriteSheet())被調用時,成員尚未初始化,由Game.init()觸發。

奇怪的是,在Game.init()中,spriteSheet在調用new Texture(this)之前被初始化。你可以檢查spriteSheet在try/catch塊之後不爲空,spriteSheet = loader.loadImage("/Sprite_Sheet.png")Game.init()之後。

+0

其實,問題可能在'loader.loadImage(「/ Sprite_Sheet.png」);','loader'是一個'BufferedImageLoader'。該方法必須構造並返回一個'SpriteSheet(null)'。您應該在該方法中添加一些檢查。正如@turingcomplete所提到的,這可能是一個路徑問題。 – toto2 2014-11-02 18:16:36

+0

我該如何去解決這個問題? (對不起,再次愚蠢)啊右:S – BiblyDoo 2014-11-02 18:18:33

+0

添加代碼,檢查您是否讀過該文件。某件事一定失敗了,你得到一個空。我們不必爲該方法的代碼。 – toto2 2014-11-02 18:20:39