无法从双HashMap中检索

时间:2015-05-16 20:15:14

标签: java arrays matrix hashmap

我正在尝试将16乘16乘16包含每个点的值。 每个点都是16位整数(短)。

我一直收到这个错误:

Exception in thread "main" java.lang.NullPointerException
    at Chunk.getBlock(Chunk.java:42)
    at Foo.main(ChunkTest.java:12)

继承我的代码:

import java.util.HashMap;

public class Chunk {
    private HashMap<Byte, HashMap<Byte, Short>> tiles = new HashMap<Byte, HashMap<Byte, Short>>();

    public Chunk() {
        HashMap<Byte, Short> tile;

        //Create 16 tiles
        for(byte i = 0; i<16;i++) {
            System.out.println(i);
            tile = new HashMap<Byte, Short>();

            //Fills the tile with the default value, 1
            for(short e = 0; e<256;e++) {
                System.out.println(e);
                tile.put((byte) e, (short) 1);
            }

            tiles.put(i, tile);

        }
    }

    //Should return the id(short) at the specified coordinates.
    public short getBlock(byte x, byte y, byte z) {
        HashMap<Byte, Short> tile = tiles.get(y);

        short block = tile.get(x+(z*16)); //Line 42

        return block;
    }

}

我已经读了5次我的代码,但我仍然无法弄清楚出了什么问题。据我所知,应该可以制作一个双HashMap。

那么如何制作一个,并检索它的值?

1 个答案:

答案 0 :(得分:1)

tile.get( x+(z*16) );

由于数字提升,此表达式x+(z*16)将其所有操作数转换为int。因此,由于Map#getObject作为参数,因此结果会被设置为IntegerInteger永远不会等于Byte,尽管在数值上是等价的,因为也有类型检查。

请改为尝试:

tile.get((byte) ( x+(z*16) ));

这应该有效,假设结果始终在0到255之间。(但请注意,转换将大于127的值转换为负数,因为byte已签名。)

作为一个考虑的建议,如果您的图块索引值总是在如此小的范围内,您可以考虑仅使用数组作为表而不是Map

类似的东西:

short[][] tiles = new short[16][256];

for (int i = 0; i < 16; ++i)
    for (int e = 0; e < 256; ++e)
        tiles[i][e] = 1;

您可以避免装箱转换和数字促销问题。是否更好取决于您正在做什么以及您是否将使用put / get以外的操作。