2016-03-14 3 views
0

У меня есть ContentValues, что я разбираю данные. Я только что получил очень странный отчет об ошибке:ContentValues ​​getAsLong NullPointerException

Fatal Exception: java.lang.NullPointerException: Попытка вызвать виртуальный метод с длинным 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; 
     } 
    } 
} 

Он должен просто вернуть значение null, если поле равно null, нет?

Update:

Пытался несколько вещей, чтобы воссоздать эту трассировку стеки и в конце концов это сузило:

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: не может распаковывать Нулевое значение

, который имеет смысл. Тем не менее, давая ту же линию выполнения обычно в коде выходов:

попытка вызвать виртуальный метод «долго java.lang.Long.longValue()» на нулевой ссылки на объект

Что я угадание является основной причиной ошибки unbox. Я понимаю unboxing, но я не эксперт, поэтому мне хотелось бы лучше объяснить, почему трассировка стека кажется такой странной (и тонкой) для этой ошибки. Благодаря!

+0

Ваш «ключ» не является нулевым? или mValues? или «значения» в новой дате() –

+0

Было немного слишком кратким. Я проверяю нулевые значения. Несмотря на это, я получаю другую ошибку для нулевого ключа, mValues ​​или значений, которые, как я полагаю. – Anthony

+0

Вы пытались отладить? Какова ценность 'Meta.Data.TIMESTAMP'? –

ответ

0

У меня была такая же ошибка, что бы проверить, существует ли такой ключ с containsKey().

values.containsKey(Meta.Data.TIMESTAMP) 

Я подозреваю использование слабой ссылки на результаты базы данных. Не совсем уверен. Просто добавьте обходной путь здесь для этой странной ошибки.

Смежные вопросы