I am encountering a null pointer when I loop through my array. Is there a test I can run to find out what might be causing this error... and maybe why there is no value when there should? The system stops at mapTiles[0][33]. Here's the code:
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
}
You should initialize the MapTile 2D array using your mapLines
object. Right now you're assuming it will always be 22x34.
This could easily cause a cause a null pointer where some map tiles aren't initialized. It could also cause an IndexOutOfBounds.
Your error is going to come down to that. Somewhere you are not initializing that index in the mapTile array.