객체를 통해 반복 할 때 널 포인터 배열이 발생합니다. 어떻게 잡히나요?

StackOverflow https://stackoverflow.com/questions/19842584

  •  29-07-2022
  •  | 
  •  

문제

배열을 통과 할 때 널 포인터가 발생합니다. 이 오류의 원인을 찾기 위해 실행할 수있는 테스트가 있습니까? 시스템은 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에 대한 정보를 찾을 수 있습니다 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top