Java中自动装箱时的NPE

Java中自动装箱时的NPE,java,autoboxing,mapdb,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 c

我有以下代码:

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

编辑:映射不是空的。更具体地说,在mapDB的BTreeMap代码中,执行以下行:

if(key==null) throw new NullPointerException();
如果有人想看一看: 行: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。

NPE是因为map对象为null,而您引用的get()方法为null,因此为NPE。 检查映射是否为空,您将找到您的解决方案

if(map!=null){
long oldVal = map.get(blk);}
 else {
System.out.println("Map is null");
}

NPE是因为map对象为null,并且您引用的是null的get()方法,因此NPE。 检查映射是否为空,您将找到您的解决方案

if(map!=null){
long oldVal = map.get(blk);}
 else {
System.out.println("Map is null");
}

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


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

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


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

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

  • 映射为空
  • 将null值传递给get方法(不是这种情况)
  • MapDB中不存在的
    get()
    传递密钥
  • 在这里,我更关心的是
    第3个
    ,因为如果您传递一个不存在的密钥,则返回null,并尝试在
    Long oldVal
    中存储null会导致异常(我相信会发生以下情况):

    要确定是否为#3,请执行以下操作

    //if key don't exist MapDB returns null
    if(map.get(blk) != null) { //not null } else { //yes null}
    
    要找出map是否如其他人所指出的那样明显为null,请执行以下操作

    //invoking get on a null can cause NPE too, so another reason
    if(map != null) { // not null } else { //yes null}
    
    为了支持#3可能导致NPE的事实,请参阅这篇文章,并附上一个类似的例子

    查看下面get(对象)的文档

    public V get(对象键)
    指定人:
    进入接口映射
    覆盖:
    进入类抽象映射
    
    查看并按如下方式指定get(对象键):

    返回指定键映射到的值,如果为空,则返回null 此映射不包含密钥的映射


    get(Object)
    of
    Map
    bstractMap
    如果未找到映射,则返回
    null
    。它还能够抛出
    NullPointerException
    。因此#3仍然可能是这样的情况,即在map中传递给get方法的键没有条目

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

  • 映射为空
  • 将null值传递给get方法(不是这种情况)
  • MapDB中不存在的
    get()
    传递密钥
  • 在这里,我更关心的是
    第3个
    ,因为如果您传递一个不存在的密钥,则返回null,并尝试在
    Long oldVal
    中存储null会导致异常(我相信会发生以下情况):

    要确定是否为#3,请执行以下操作

    //if key don't exist MapDB returns null
    if(map.get(blk) != null) { //not null } else { //yes null}
    
    要找出map是否如其他人所指出的那样明显为null,请执行以下操作

    //invoking get on a null can cause NPE too, so another reason
    if(map != null) { // not null } else { //yes null}
    
    为了支持#3可能导致NPE的事实,请参阅这篇文章,并附上一个类似的例子

    查看下面get(对象)的文档

    public V get(对象键)
    指定人:
    进入接口映射
    覆盖:
    进入类抽象映射
    
    查看并按如下方式指定get(对象键):

    返回指定键映射到的值,如果为空,则返回null 此映射不包含密钥的映射


    get(Object)
    of
    Map
    bstractMap
    如果未找到映射,则返回
    null
    。它还能够抛出
    NullPointerException
    。因此#3仍然可能是这样的情况,即在map中传递给get方法的键没有条目

    我认为问题在于您看到的BTreeMap代码版本错误。如果返回到,则第1024行不是:

    if(key==null) throw new NullPointerException();
    
    但是:

    其中,
    A
    由以下各项设置:

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

    这更有意义。基本上,
    null
    是从
    引擎返回的。get
    。这是怎么可能的超出了我的理解,但这很可能是mapdb本身的一个缺陷。

    我认为问题在于您看到的BTreeMap代码版本错误。如果返回到,则第1024行不是:

    if(key==null) throw new NullPointerException();
    
    但是:

    其中,
    A
    由以下各项设置:

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

    这更有意义。基本上,
    null
    是从
    引擎返回的。get
    。我无法理解这是如何实现的,但这很可能是mapdb本身的一个缺陷。

    您绝对确定map不是空的吗?您是否在相关行上方的一行代码中实际测试了这一点?i、 例如,
    System.out.println(“is-map-null:+(map==null))您的映射是自定义数据结构吗?变量“map”不为null,否则它将在开始时被命中,即一旦命中此代码,情况并非如此。一旦被创建,它就永远不会改变,所以以后也不会变为空。显然,现在是时候进行修改了。如果您说
    map
    不是
    null
    ,则目前无法回答此问题。没有添加stacktrace有什么原因吗?@Raf stacktrace清楚地表明,NPE来自
    BTreeMap
    类本身。即使它将返回
    null
    (尽可能多),也不会有问题,因为程序将以
    Long oldVal=null
    结束,这是可以的。您绝对确定map不是null吗?您是否在相关行上方的一行代码中实际测试了这一点?i、 例如,
    System.out.println(“is-map-null:+(map==null))您的映射是自定义数据结构吗?变量“map”不为null,否则它将在开始时被命中,即一旦命中此代码,情况并非如此。一旦被创建,它就永远不会改变,所以以后也不会变为空。显然,现在是时候进行修改了。目前这是不可能的