2012-12-28 184 views
0

爲了避免空指針的問題,我以爲我初始化了數組中的所有對象,但似乎我在某處出錯了。初始化二維數組對象

繼承此類的代碼。在數組外部使用MapBlock對象時,它可以正常工作。

執行是當它試圖訪問更新方法中的對象。

public class Game { 
private Scanner scan; 

// map stuff 
MapBlock[][] mapObjects; 


// List of Textures 
Texture path; 
Texture tower; 
Texture grass; 

Game(){ 
    // Textures 
    path = loadTexture("path"); 
    tower = loadTexture("tower"); 
    grass = loadTexture("grass"); 



    mapObjects = new MapBlock[24][16]; 

    loadLevelFile("level1");   

} 

public void update(){ 
    if(mapObjects[0][0] == null) 
     System.out.println("its null!!!"); 
    mapObjects[0][0].update(); 
} 

public void render(){ 
    mapObjects[0][0].render();  
} 




private Texture loadTexture(String imageName){ 
    try { 
     return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/" + imageName + ".png"))); 
    }catch(FileNotFoundException e){ 
     e.printStackTrace(); 
    }catch(IOException r){ 
     r.printStackTrace(); 
    } 
    return null; 
} 

private void loadLevelFile(String mapName){ 
    try { 
     scan = new Scanner(new File("res/" + mapName + ".txt")); 
    } catch (FileNotFoundException e) { 
     System.out.println("Could not open "+ mapName +" file!"); 
     e.printStackTrace(); 
    } 

    String obj; 
    int i = 0, t = 0; 

     while(scan.hasNext()){ 
      obj = scan.next(); 

      if(obj == "o"){ 
       mapObjects[i][t] = new MapBlock("GRASS", t*32, i*32, grass); 

      }else if(obj == "x"){ 
       mapObjects[i][t] = new MapBlock("PATH", t*32, i*32, path); 

      }else if(obj == "i"){ 
       mapObjects[i][t] = new MapBlock("TOWER", t*32, i*32, tower);      
      } 

      if(i < 24){ 
       i++; 
      }else{ 
       i = 0; 
       t ++; 
      } 

     } 
    } 

}

謝謝你的任何反饋

+0

發佈完整的例外消息。 – Mob

+0

你在哪裏得到這個異常 –

+0

其空! 異常在線程 「主」 顯示java.lang.NullPointerException \t在Game.update(Game.java:41) \t在Main.update(Main.java:65) \t在Main.gameLoop(Main.java:59 )Main.main(Main.java:22)處的 \t。它在同一行上運行mapObjects [0] [0] .update();對不起,它的所有聚集在一起不能發佈 –

回答

4

在你loadLevelFile方法:

-> if(obj == "o"){ 
// ... 
-> }else if(obj == "x"){ 
// ... 
-> }else if(obj == "i"){ 
// ... 
} 

你跟==,而不是.equals()比較字符串,可能這導致的實例你的mapObjects陣列不會發生。

嘗試將其更改爲:

if(obj.equals("o")){ 
// ... 
}else if(obj.equals("x")){ 
// ... 
}else if(obj.equals("i")){ 
// ... 
} 

錯誤發生在這裏:

if(mapObjects[0][0] == null) 
    System.out.println("its null!!!"); 
mapObjects[0][0].update(); <- Error happens here 

因爲mapObjects[0][0]的對象仍然null,爲loadLevelFile方法沒有實例化。

+0

謝謝你,我的弱點!它沒有發生在我身上,if()可能是問題的一部分。它現在的作品,現在謝謝你,我也必須改變,如果(我<24)如果(我<23)停止出界的錯誤,我只是想出了爲什麼輸入這個笑聲。再次感謝! –

+0

@richilonsdale只是在未來的建議;在任何菊花鏈風格的if-else if-else if-'子句中添加最後的'else',並且如果你不希望在那裏拋出/打印錯誤; 'else {System.out.println(「這不應該發生。」); }'。這樣你就會更快地得到這個問題的警報,並且在它的實際來源。 – NominSim

+0

這是一個很好的建議,非常感謝你的幫助,iv今天從這個網站的人們學到了更多,然後是最近幾周閱讀書籍並觀看YouTube的信息。 –