循环遍历对象时遇到空指针数组.我怎么抓住它



当我遍历数组时,我遇到了一个空指针。我可以运行测试来找出可能导致此错误的原因吗?也许为什么应该有价值时没有价值?系统停止在地图图块[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

}

您应该使用 mapLines 对象初始化 MapTile 2D 数组。 现在你假设它总是22x34。

这很容易导致某些地图图块未初始化的空指针。 它还可能导致 IndexOutOfBounds。

你的错误将归结为这一点。 在某个地方,您没有在 mapTile 数组中初始化该索引。

使用单元测试工具,如JUnit,Mockito来测试你的类。这样,您可以使用不同的值设置MapTile[][]并针对它运行测试。有关Mockito的信息可以在这里找到

相关内容

  • 没有找到相关文章

最新更新