在Java中自动装箱时的NPE

时间:2015-12-08 22:54:47

标签: java autoboxing mapdb

我有以下代码:

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。

4 个答案:

答案 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可能是由于以下任何原因:

  1. 地图为空
  2. 将null值传递给get方法(不是这种情况)
  3. 将密钥传递给get()
  4. 中不存在的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>
    

    查看MapAbstractMap 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;真的已经初始化了。