0

我有一个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()”

我猜这是拆箱错误的根本原因。我掌握拆箱,但我不是专家,所以我想更好地解释为什么堆栈跟踪对于这个错误看起来如此奇怪(和挑剔)。谢谢!

4

1 回答 1

0

我遇到了同样的错误,通过使用 containsKey() 检查此类密钥是否存在来解决。

values.containsKey(Meta.Data.TIMESTAMP)

我怀疑对数据库结果使用弱引用。不完全确定。只需在此处为这个奇怪的错误添加一个解决方法。

于 2016-07-09T13:35:11.583 回答