0

我有以下代码:

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();

万一有人想看看:mapDB Line: 1024的 BtreeMap

部分堆栈跟踪:

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。

4

4 回答 4

2

我认为问题在于您正在查看错误版本的 BTreeMap 代码。如果你回到这个类的上一次提交,第 1024 行不是:

if(key==null) throw new NullPointerException();

但:

while(!A.isLeaf()) {...}

由哪里A设置:

BNode A = engine.get(current, nodeSerializer);

这更有意义。基本上,null是从engine.get. 这怎么可能超出我的理解,但这很可能是 mapdb 本身的错误。

于 2015-12-09T02:37:27.470 回答
1

NPE 可能是由于以下任何原因造成的:

  1. 地图为空
  2. 传递一个空值来获取方法(不是这种情况)
  3. 传递一个get()不存在的密钥MapDB

number 3在这里更担心,因为如果您传递一个不存在的键,则返回 null 并尝试存储 nullLong oldVal导致异常(我相信会发生以下情况):

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}

要找出其他人指出的 map 是否明显为空,请执行以下操作

//invoking get on a null can cause NPE too, so another reason
if(map != null) { // not null } else { //yes null}

为了支持 #3 可能导致 NPE 的事实,请参阅这篇有类似问题的帖子。

查看BTreeMap的文档,获取下面的 get(Object)

public V get(Object key)
Specified by:
get in interface Map<K,V>
Overrides:
get in class AbstractMap<K,V>

查看MapAbstractMap的 get(Object key) 指定如下:

返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。

get(Object)ofMap<K,V>和 A​​ 如果没有找到映射则bstractMap<K,V>返回。null它还可以投掷NullPointerException。因此,#3 仍然可能是在 map 中传递给 get 方法的键没有条目的情况。

于 2015-12-08T23:15:01.270 回答
0

NPE 是因为 map 对象为 null 并且您指的是 null 的 get() 方法,因此是 NPE。检查地图是否为空,您会找到解决方案。

if(map!=null){
long oldVal = map.get(blk);}
 else {
System.out.println("Map is null");
}
于 2015-12-08T22:58:46.493 回答
0

我只看到一种可能性:变量“map”为空。

您的代码示例不完整,因为您没有显示以及真正初始化“地图”的位置。

于 2015-12-08T22:58:59.007 回答