您应该使用您的Maptile 2D阵列初始化 mapLines
目的。现在,您假设它将始终为22x34。
这很容易引起原因,其中一些地图图块未初始化。它也可能引起索引。
您的错误将归结为此。在某个地方,您不会在Maptile数组中初始化该索引。
题
当我循环穿过数组时,我正在遇到一个无效的指针。是否可以进行测试,以找出可能导致此错误的原因……也许为什么在需要时没有价值?该系统停在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
}
解决方案
您应该使用您的Maptile 2D阵列初始化 mapLines
目的。现在,您假设它将始终为22x34。
这很容易引起原因,其中一些地图图块未初始化。它也可能引起索引。
您的错误将归结为此。在某个地方,您不会在Maptile数组中初始化该索引。
其他提示
使用Junit,Mockito等单元测试工具来测试您的课程。这样您可以设置 MapTile[][]
具有不同的值并对其进行运行测试。可以找到有关Mockito的信息 这里