2015-01-01 38 views
2

我正在用2D視圖製作小遊戲,並從上方查看視圖。我試着這樣做:在遊戲解析文件製作遊戲地圖時出現NullPointerException

1)我有一個爲.txt

2地圖佈局本地文件)解析這個文件,並在地圖佈局)上繪製的一切屏幕

我(認爲是)成功解析文件並將其放入應用程序,但它無法繪製,拋出NullPointerException。我知道這裏有些東西是空的,但是我沒有看到什麼和在哪裏 - 從我的角度來看,一切都應該是這樣。

一些代碼:

BufferedReader br = new BufferedReader(new FileReader(s)); 

     mapwidth = Integer.parseInt(br.readLine()); 
     mapheight = Integer.parseInt(br.readLine()); 


     String delimiters = " "; 
     for (row = 0; row < mapheight; row++){ 
      String line = br.readLine(); 
      String[] tokens = line.split(delimiters); 
      for (col = 0; col < mapwidth ; col++){ 
       map[row][col] = Integer.parseInt(tokens[col]); 

      } 
     } 

這是函數解析文件到程序。前兩行讀取地圖寬度和高度(從所述文件),然後對於文件中的每個值,我在地圖[row] [col]中創建一個點

這是負責爲地圖的每個點製作對象的另一個函數

String wall ="Images/wall.jpg"; 
BufferedImage WALL = ImageIO.read(new File(wall)); 
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); } 

最後一行是拋出一個NullPointerException。 瓷磚在我的遊戲中是單場。它有四個值 - BufferedImage,阻塞,可走和可破壞(最後三個是布爾值)。 此外,如果我將代碼與解析代碼一起製作,這並不重要。我仍然有例外。 我知道這裏有一些缺失,但我無法弄清楚什麼。

後來我想畫的所有瓷磚:

public void paint(Graphics g){    
    for (row=0; row < mapheight; row++) 
     for(col = 0; col < mapwidth; col++){ 
      g.drawImage(
        tile[row][col].getImage(), 
          row*tileSize, 
          col*tileSize, 
          null 
         ); 

我認爲它可能有一些錯誤,但我不知道。我想要做的就是拍攝每塊瓷磚的圖像並將其繪製在適當的行和列中。每個字段都是一個正方形(長度= tileSize)。

編輯

謝謝大家!

@Thierry - 調試後我發現瓷磚仍然是空的,並沒有填滿。所以,我做了一個空的實例並將這兩個函數放在一起。現在它看起來像這樣和正常工作:

public GameTileMap(String s, int tileSize){ 
    this.tileSize = tileSize; 

    try{ 
     BufferedReader br = new BufferedReader(new FileReader(s)); 

     mapwidth = Integer.parseInt(br.readLine()); 
     mapheight = Integer.parseInt(br.readLine()); 
     map = new int[mapheight][mapwidth]; 
     tile = new Tile[mapheight][mapwidth]; 

     int mh = mapheight; 
     int mw = mapwidth ; 

     String delimiters = " "; 
     for (row = 0; row < mh; row++){ 
      String line = br.readLine(); 
      String[] tokens = line.split(delimiters); 
      for (col = 0; col < mw ; col++){ 
       map[row][col] = Integer.parseInt(tokens[col]); 

      } 
     } 
     String wall ="Images/wall.jpg"; 
     String brick = "Images/brick.jpg"; 
     String grass ="Images/grass.jpg"; 
     String water = "Images/water.jpg"; 
     BufferedImage WALL = ImageIO.read(new File(wall)); 
     BufferedImage BRICK = ImageIO.read(new File(brick)); 
     BufferedImage GRASS = ImageIO.read(new File(grass)); 
     BufferedImage WATER = ImageIO.read(new File(water)); 
     for (row = 0; row < mh; row++){ 
      for (col = 0; col < mw ; col++){ 

     if (map[row][col] == 0) { tile[row][col] = new Tile(GRASS, false, true, false); } 
     else if (map[row][col] == 1) {tile[row][col] = new Tile(BRICK, true, false, true);} 
     else if (map[row][col] == 2) {tile[row][col] = new Tile(WALL, true, false, false);} 
     else if (map[row][col] == 3) {tile[row][col] = new Tile(WATER, false, false, false);} 
     else {tile[row][col] = new Tile(GRASS, false, true, false);}; 
      } 
     } 
    } 
    catch(Exception e){ 
    e.printStackTrace();} 

} 
+0

這是導致你的異常的代碼:'if(map [row] [col] == 0){tile [row] [col] = new Tile(WALL,false,true,false); }'?只要確保我理解正確。 –

+3

異常stacktrace包含答案。至少將它縮小到線路上拋出的異常 – ata

+0

@Ata - 我已經做了,我已經指出了哪條線路造成了麻煩。 – WarmasterMazuran

回答

3

如果你有一個NPE:

if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); 

則只有4解決方案:

  • 映射爲null
  • 或圖[行]爲空
  • 或瓷磚是null
  • 或瓷磚[行]爲空
1

執行此操作後:

for (row = 0; row < mapheight; row++){ 
     String line = br.readLine(); 
     String[] tokens = line.split(delimiters); 
     for (col = 0; col < mapwidth ; col++){ 
      map[row][col] = Integer.parseInt(tokens[col]); 

     } 
    } 

兩個rowcol會走出束縛,因爲最後一行++和col ++的。這是試圖訪問if (map[row][col] == 0)

NullPointerException陣列中的時候爲什麼你所得到的外邊界錯誤意味着你在某種程度上引用索引小於0或大於長度() - 1

+0

不會導致'ArrayIndexOutOfBounds'異常,而不是'NullPointerException'? –

+0

它應該導致兩者,實際上。 @dudeprgm – Jobs