귀하는 귀하의 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에 대한 정보를 찾을 수 있습니다 여기