我正在尝试将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。
那么如何制作一个,并检索它的值?
答案 0 :(得分:1)
tile.get( x+(z*16) );
由于数字提升,此表达式x+(z*16)
将其所有操作数转换为int
。因此,由于Map#get
将Object
作为参数,因此结果会被设置为Integer
。 Integer
永远不会等于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
以外的操作。