我有以下代码:
map = db_.treeMapCreate(validMapName_)
.keySerializer(Serializer.LONG)
.valueSerializer(Serializer.LONG)
.make(); //mapDB
protected void onTaskCompletion(TaskInfo task)
{
long startBlk = task.blkId;
long count = task.count;
for (int i=0; i < count; ++i)
{
long blk = startBlk + i;
Long oldVal = map.get(blk); //NPE here
...
...
}
}
如何在自动装箱时获得NPE?我可以理解在取消装箱时获得NPE,即如果我有:
long oldVal = map.get(blk)
然后那可以抛出一个NPE。
编辑:地图不是空的。更具体地说,在mapDB的BTreeMap代码中,该行被执行:
if(key==null) throw new NullPointerException();
如果有人想看看:BtreeMap of mapDB 行:1024
部分堆栈跟踪:
java.lang.NullPointerException
at org.mapdb.BTreeMap.get(BTreeMap.java:1024)
at org.mapdb.BTreeMap.get(BTreeMap.java:1013)
at com.service.onTaskCompletion(TaskHandler.java:312)
我无法重现它,所以我不能给出一个最小的,可验证的例子。 我试图运行它,以便我为一个不存在的密钥执行get(),并且它没有给出NPE。
答案 0 :(得分:2)
我认为问题在于您正在查看错误版本的BTreeMap代码。如果您返回previous commit of this class,则第1024行不是:
if(key==null) throw new NullPointerException();
但:
while(!A.isLeaf()) {...}
其中A
由:
BNode A = engine.get(current, nodeSerializer);
这更有意义。基本上,null
会返回engine.get
。怎么可能超出我的理解,但这很可能是mapdb本身的错误。
答案 1 :(得分:1)
NPE可能是由于以下任何原因:
get()
MapDB
醇>
我在这里更关心number 3
因为,如果你传递一个不存在的密钥,那么返回null并尝试在Long oldVal
中存储null导致异常(我相信某些东西为跟着发生):
Long l = new Long(null); //NPE
要查找是否为#3,请执行以下操作
//if key don't exist MapDB returns null
if(map.get(blk) != null) { //not null } else { //yes null}
要明白其他人指出的地图是否为空,请按以下步骤进行操作
//invoking get on a null can cause NPE too, so another reason
if(map != null) { // not null } else { //yes null}
为了支持#3可能导致NPE的事实,请使用类似的issue查看此帖子。
查看BTreeMap下面的get(Object)
的文档public V get(Object key)
Specified by:
get in interface Map<K,V>
Overrides:
get in class AbstractMap<K,V>
查看Map和AbstractMap get(对象键)指定如下:
如果找不到映射,则返回指定键映射到的值,如果是,则返回null 此地图不包含密钥的映射。
get(Object)
的{p> Map<K,V>
和bstractMap<K,V>
会返回null
。它也能投掷NullPointerException
。所以#3仍然可能是在地图中传递给get方法的密钥没有条目的情况。
答案 2 :(得分:0)
NPE是因为map对象为null而你指的是null的get()方法,因此是NPE。 检查地图是否为null,您将找到解决方案。
if(map!=null){
long oldVal = map.get(blk);}
else {
System.out.println("Map is null");
}
答案 3 :(得分:0)
我只看到一种可能性:变量&#34; map&#34;是空的。
您的代码示例不完整,因为您没有显示以及&#34; map&#34;真的已经初始化了。