我在Java中遇到问题。 守则如下:
Map<Object, Object> test = myClass.getMap();
int value = (int) test.get(myID);
当我到达第二行时,我得到了:
java.lang.NullPointerException
现在我问自己如何调试这个并找到为什么这不起作用?我很确定所有的键和值都在这张地图中。
如何打印整个地图,以便我可以搜索密钥是否可用? (这是一张很长的地图)
或者找到问题的正确方法是什么?
答案 0 :(得分:5)
您可以map.containsKey(key)
检查密钥是否存在
NPE的原因是,myId
中map
的值为null
,而您正尝试将其转换为原始int
(无法保存非空值)。将其更改为以下语句将避免异常(除非地图test
本身为null
)
Integer value = (Integer ) test.get(myID);
答案 1 :(得分:2)
这里有多个问题:
Map test
可以是null
。Object
投射到int
。您需要将其强制转换为Integer
。我认为以下行不应该编译:
int value = (int) test.get(myID);
当get()
返回Object
时,您正在尝试将其转换为原始int
。即使你把它投到Integer
:
int value = (Integer) test.get(myID); // assume auto-unwrapping here
如果get(myID);
为null
,则上述代码将抛出NPE。
你需要使用:
Integer value = (Integer) test.get(myID);
您可以使用test.containsKey(myID)
来检查密钥。最后做这样的事情:
if(test!=null && test.containsKey(myID))
Integer value = (Integer) test.get(myID);
您应该在Map
中使用Generics。
答案 2 :(得分:0)
使用带有集成调试器的IDE:在实例化地图之后和初始化之后的某处放置一个断点,并有效地查看地图中的内容。
答案 3 :(得分:0)
如果你想打印地图,那么回答你的问题:
for (Entry<Object, Object> entry : test.entrySet()) {
System.out.println("Key:" + entry.getKey() + " Value:" + entry.getValue());
}
然而,containsKey()
方法可能应该是您所需要的。