我有ContentValues
我正在解析数据。我刚收到一份非常奇怪的崩溃报告:
致命异常:java.lang.NullPointerException:尝试调用 虚方法' long java.lang.Long.longValue()'在null对象上 参考
private void populateMeta(final ContentValues values)
{
if (values == null)
return;
Date d = new Date(values.getAsLong(Meta.Data.TIMESTAMP));
...
}
当我查看getAsLong
时,我无法看到这种情况如何发生:
public Long getAsLong(String key) {
Object value = mValues.get(key);
try {
return value != null ? ((Number) value).longValue() : null;
} catch (ClassCastException e) {
if (value instanceof CharSequence) {
try {
return Long.valueOf(value.toString());
} catch (NumberFormatException e2) {
Log.e(TAG, "Cannot parse Long value for " + value + " at key " + key);
return null;
}
} else {
Log.e(TAG, "Cannot cast value for " + key + " to a Long: " + value, e);
return null;
}
}
}
如果该字段为空,它应该只返回null,不是吗?
更新
尝试了一些方法来重新创建堆栈跟踪,最后将其缩小:
values = new ContentValues();
Long timestamp = values.getAsLong(Meta.Data.TIMESTAMP); // null, as expected
Date d2 = new Date(timestamp); // source of error
现在这里有趣的事情。在new Date(timestamp)
投掷
NullPointerException:无法取消设置空值
这是有道理的。但是,让同一行在代码中正常执行会产生:
尝试调用虚拟方法' long java.lang.Long.longValue()'在空对象引用上
我猜的是unbox错误的根本原因。我掌握拆箱,但我不是专家,所以我喜欢更好的解释为什么堆栈跟踪对于这个错误看起来很奇怪(而且挑剔)。谢谢!
答案 0 :(得分:0)
我遇到了同样的错误,通过检查containsKey()是否存在这样的密钥来解决。
def fib(i: Int): Option[Int] = i match {
case 0 => 0.some //Ok, a little bit of Scalaz's syntax sugar
case 1 => 1.some
case x if x > 1 => for {
a <- fib(i - 1)
b <- fib(i - 2)
} yield a + b
case _ => None
}
我怀疑对数据库结果使用弱引用。不完全确定。只是在这里为这个奇怪的错误添加一个解决方法。