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可能是由于以下任何原因造成的:
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)
ofMap
和bstractMap
如果未找到映射,则返回null
。它还能够抛出NullPointerException
。因此#3仍然可能是这样的情况,即在map中传递给get方法的键没有条目 NPE可能是由以下任何原因造成的:
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)
ofMap
和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,否则它将在开始时被命中,即一旦命中此代码,情况并非如此。一旦被创建,它就永远不会改变,所以以后也不会变为空。显然,现在是时候进行修改了。目前这是不可能的