ContentValues getAsLong NullPointerException

时间:2016-03-14 00:19:56

标签: android nullpointerexception content-values

我有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错误的根本原因。我掌握拆箱,但我不是专家,所以我喜欢更好的解释为什么堆栈跟踪对于这个错误看起来很奇怪(而且挑剔)。谢谢!

1 个答案:

答案 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
}

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