gpt4 book ai didi

java - 无法从双 HashMap 中检索

转载 作者:行者123 更新时间:2023-12-01 11:32:45 24 4
gpt4 key购买 nike

我正在尝试制作一个 16 x 16 x 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;
}

}

我已经把代码读了五遍了,但我仍然不知道哪里出了问题。据我所读,应该可以制作一个双 HashMap。

那么我该如何制作一个并检索它的值呢?

最佳答案

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 是有符号的。)

<小时/>

建议考虑一下,如果您的图 block 索引值始终落在如此小的范围内,您可以考虑仅使用数组作为表格,而不是 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 之外的操作。

关于java - 无法从双 HashMap 中检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com