解析文件以制作游戏地图时出现 NullPointerException

NullPointerException when parsing file to make game map

我正在制作一款 2D 小游戏,可以从上方观看。我正在尝试这样做:

1) 我有一个包含地图布局的 .txt 本地文件

2) 解析此文件并在游戏中制作地图布局

3) 在屏幕上绘制所有内容

我(认为是)成功解析文件并将其放入应用程序,但它无法绘制,抛出 NullPointerException。我知道这里有些东西是空的,但我看不到是什么和在哪里 - 从我的角度来看,一切都在它应该在的地方。

一些代码:

BufferedReader br = new BufferedReader(new FileReader(s) );

        mapwidth = Integer.parseInt(br.readLine());
        mapheight = Integer.parseInt(br.readLine());


        String delimiters = " ";
        for (row = 0; row < mapheight; row++){
            String line = br.readLine();
            String[] tokens = line.split(delimiters);
            for (col = 0; col < mapwidth ; col++){
                map[row][col] = Integer.parseInt(tokens[col]);

            }
        }

这是将文件解析为程序的函数。前两行读取地图宽度和高度(来自所述文件),然后对于文件中的每个值,我在 map[row][col]

中创建一个点

这是另一个负责为地图的每个点制作对象的函数

String wall ="Images/wall.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false);  }

最后一行抛出 NullPointerException。 Tile 是我游戏中的一个字段。它有四个值——BufferedImage、blocked、walkable 和 destructable(最后三个是布尔值)。 另外,如果我把制作对象的代码和解析代码放在一起也没关系。我仍然有例外。 我知道这里缺少一些东西,但我不知道是什么。

稍后我想绘制所有瓷砖:

public void paint(Graphics g){               
    for (row=0; row < mapheight; row++)
        for(col = 0; col < mapwidth; col++){
            g.drawImage(
                    tile[row][col].getImage(),
                            row*tileSize,
                            col*tileSize,
                            null
                        );

我认为它可能有一些错误,但我不确定。我想要做的是获取每个图块的图像并将其绘制在适当的行和列中。每个字段都是一个正方形(长度 = tileSize)。

编辑

谢谢大家!

@Thierry - 调试后我发现 tile 仍然是 null 并且没有填满。所以,我制作了一个空的 tile 实例并将这两个函数放在一起。现在它看起来像这样并且可以正常工作:

public GameTileMap(String s, int tileSize){
    this.tileSize = tileSize;

    try{
        BufferedReader br = new BufferedReader(new FileReader(s) );

        mapwidth = Integer.parseInt(br.readLine());
        mapheight = Integer.parseInt(br.readLine());
        map = new int[mapheight][mapwidth];
        tile = new Tile[mapheight][mapwidth];

        int mh = mapheight;
        int mw = mapwidth ;

        String delimiters = " ";
        for (row = 0; row < mh; row++){
            String line = br.readLine();
            String[] tokens = line.split(delimiters);
            for (col = 0; col < mw ; col++){
                map[row][col] = Integer.parseInt(tokens[col]);

            }
        }
        String wall ="Images/wall.jpg";
        String brick = "Images/brick.jpg";
        String grass ="Images/grass.jpg";
        String water = "Images/water.jpg";
        BufferedImage WALL = ImageIO.read(new File(wall));
        BufferedImage BRICK = ImageIO.read(new File(brick));
        BufferedImage GRASS = ImageIO.read(new File(grass));
        BufferedImage WATER = ImageIO.read(new File(water));
        for (row = 0; row < mh; row++){
            for (col = 0; col < mw ; col++){

        if (map[row][col] == 0) { tile[row][col] = new Tile(GRASS, false, true, false);  }
        else if (map[row][col] == 1) {tile[row][col] = new Tile(BRICK, true, false, true);}
        else if (map[row][col] == 2) {tile[row][col] = new Tile(WALL, true, false, false);}
        else if (map[row][col] == 3) {tile[row][col] = new Tile(WATER, false, false, false);}
        else {tile[row][col] = new Tile(GRASS, false, true, false);};
            }
        }
    }
    catch(Exception e){
    e.printStackTrace();}

}

执行此操作后:

for (row = 0; row < mapheight; row++){
        String line = br.readLine();
        String[] tokens = line.split(delimiters);
        for (col = 0; col < mapwidth ; col++){
            map[row][col] = Integer.parseInt(tokens[col]);

        }
    }

rowcol 都会越界,因为最后的 row++ 和 col++。这就是为什么您在尝试访问 if (map[row][col] == 0)

时遇到越界错误的原因 数组中的

NullPointerException 意味着您以某种方式引用小于 0 或大于 length()-1[=23= 的索引].

如果您在 :

中有 NPE
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false);

那么只有4种解法:

  • 地图为空
  • 或地图[行]为空
  • 或磁贴为空
  • 或 tile[row] 为空