我有一个ContentValues
我正在解析的数据。我刚刚收到一个非常奇怪的崩溃报告:
致命异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“long java.lang.Long.longValue()”
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;
}
}
}
如果该字段为空,它应该只返回空,不是吗?
更新:
尝试了一些方法来重新创建堆栈跟踪,最后缩小了范围:
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()”
我猜这是拆箱错误的根本原因。我掌握拆箱,但我不是专家,所以我想更好地解释为什么堆栈跟踪对于这个错误看起来如此奇怪(和挑剔)。谢谢!