2013-11-07 3 views
0

Я столкнулся с нулевым указателем, когда я прохожу через свой массив. Есть ли тест, который я могу запустить, чтобы узнать, что может вызвать эту ошибку ... и, может быть, почему нет смысла, когда это необходимо? Система останавливается на mapTiles [0] [33]. Вот код:Обход массива нулевых указателей при циклическом перемещении объекта. Как его поймать?

import java.lang.*; 
import java.util.*; 
import java.io.*; 

public class Map { 

MapTile[][] mapTiles; 
String imageMap; 
String rawMap; 

// constructor 
public Map() { 
    imageMap = "Map_DragonShrine.jpg"; 
    rawMap = "Dragon_Shrine.map"; 
    mapTiles = new MapTile[22][34]; 
} 


// methods 
public void loadMapFile() { 

    rawMap = file2String(rawMap); 

    // array used to hold columns in a row after spliting by space 
    String[] mapCols = null; 
    // split map using 'bitmap' as delimiter 
    String[] mapLines = rawMap.split("bitmap"); 
    // assign whatever is after 'bitmap' 
    rawMap = mapLines[1]; 
    // split string to remove comment on the bottom of the file 
    mapLines = rawMap.split("#"); 
    // assign final map 
    rawMap = mapLines[0].trim(); 
    mapLines = rawMap.split("\\n+"); 

    for(int x = 0; x < mapLines.length; x++) { 
     rawMap = mapLines[x] ; 
     mapCols = rawMap.split("\\s+");    
     for(int y = 0; y < mapCols.length; y++) { 
      mapTiles[x][y] = new MapTile(mapCols[y]); 
     }    
    } 
}  

public void getTileFeatures() { 
} 

public void checkFeature() { 
    for(int x = 0; x < mapTiles.length; x++) { 
     for(int y = 0; y < mapTiles[x].length; y++) { 
      makeTile(x, y, mapTiles[x][y].getFeature()); 
      // java.lang.NullPointerException at mapTiles[0][33] 
     } 
    } 
} 

public String file2String(String filename) 
{   
    try{ 
     FileReader fileReader = new FileReader(filename); 
     String fileContents = ""; 
     int i ; 

     while((i = fileReader.read())!=-1){ 
      char ch = (char)i; 

      fileContents = fileContents + ch; 
     }//end while 

     // System.out.println(fileContents); 
     return fileContents; 
    } 
    catch(Exception e){ 
     System.out.println("File failed to load:" + e); 
     return "Error " + e; 
    } 

}//end file2String 

private void makeTile(int x, int y, String features) 
{ 
    System.out.println("line1 " + y + " test"); 
    //   mapTiles[x][y] = new MapTile();//Assumes your Map class has an array of MapTile objects called mapTiles 
    if(features.contains("w")){ mapTiles[x][y].SOLID = true; } 
    System.out.println("line2 " + y + " test"); 
    if(features.contains("s")){ mapTiles[x][y].STATUE = true; } 
    System.out.println("line3 " + y + " test"); 
    if(features.contains("A")){ mapTiles[x][y].VICTORY_A = true; } 
    System.out.println("line4 " + y + " test"); 
    if(features.contains("B")){ mapTiles[x][y].VICTORY_B = true; } 
    System.out.println("line5 " + y + " test"); 
    if(features.contains("a")){ mapTiles[x][y].START_A = true; } 
    System.out.println("line6 " + y + " test"); 
    if(features.contains("b")){ mapTiles[x][y].START_B = true; } 
    System.out.println("line7 " + y + " test"); 
    if(features.contains("h")){ mapTiles[x][y].HAUNTED = true; } 
    System.out.println("line8 " + y + " test"); 
    if(features.contains("d")){ mapTiles[x][y].DIFFICULT = true; } 
    System.out.println("line9 " + y + " test"); 
    if(features.contains("c")){ mapTiles[x][y].SACRED_CIRCLE = true; } 
    System.out.println("line10 " + y + " test"); 
    if(features.contains("u")){ mapTiles[x][y].SUMMONING_CIRCLE = true; } 
    System.out.println("line11 " + y + " test"); 
    if(features.contains("x")){ mapTiles[x][y].EXIT_A = true; } 
    System.out.println("line12 " + y + " test"); 
    if(features.contains("z")){ mapTiles[x][y].EXIT_B = true; } 
    System.out.println("line13 " + y + " test"); 
}//End makeTile 

}

+0

Вы можете распечатать трассировку стека? –

ответ

0

Вы должны инициализировать массив MapTile 2D, используя свой mapLines объект. Прямо сейчас вы предполагаете, что это всегда будет 22x34.

Это может привести к возникновению нулевой указатель, когда некоторые фрагменты карты не инициализируются. Это также может вызвать IndexOutOfBounds.

Ваша ошибка сводится к этому. Где-то вы не инициализируете этот индекс в массиве mapTile.

0

Используйте инструменты для тестирования единиц, такие как JUnit, Mockito, чтобы проверить свой класс. Таким образом, вы можете настроить MapTile[][] с различными значениями и запустить тест против него. Информация о Mockito может быть найдена here