2016-03-14 1 views
0

J'ai un ContentValues que j'analyse pour les données. Je viens de recevoir un rapport d'accident très étrange:ContentValues ​​getAsLong NullPointerException

Exception fatale: java.lang.NullPointerException: Tentative d'invoquer méthode virtuelle « à long java.lang.Long.longValue() » sur un objet nul référence

private void populateMeta(final ContentValues values) 
{ 
    if (values == null) 
     return; 

    Date d = new Date(values.getAsLong(Meta.Data.TIMESTAMP)); 
    ... 
} 

Quand je regarde dans getAsLong Je ne vois pas comment cela pourrait se produire:

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; 
     } 
    } 
} 

Il devrait juste retourner null si le champ est nul, non?

Mise à jour:

essayé quelques petites choses à recréer cette trace de la pile et à la fin ce rétrécis vers le bas:

values = new ContentValues(); 
    Long timestamp = values.getAsLong(Meta.Data.TIMESTAMP); // null, as expected 
    Date d2 = new Date(timestamp); // source of error 

Maintenant, voici la chose intéressante. Ajout d'une montre sur new Date(timestamp) lance

NullPointerException: ne peut pas unbox valeur null

ce qui est logique. Cependant, laissant cette même ligne normalement exécuter des rendements de code:

tentative d'invoquer la méthode virtuelle « à long java.lang.Long.longValue() » sur une référence d'objet nul

Ce que je suis deviner est la cause première de l'erreur unbox. Je comprends unboxing, mais je ne suis pas un expert, donc j'aimerais une meilleure explication de pourquoi la trace de la pile semble si étrange (et fastidieuse) pour cette erreur. Merci!

+0

votre 'clé' n'est-elle pas nulle? ou mValues? ou "valeurs" dans la nouvelle date() –

+0

Était un peu trop concis là. Je vérifie les "valeurs" nulles. Peu importe, j'obtiendrais une erreur différente pour la clé nulle, mValues, ou les valeurs que je crois. – Anthony

+0

Avez-vous essayé de déboguer? Quelle est la valeur de 'Meta.Data.TIMESTAMP'? –

Répondre

0

J'ai eu la même erreur, travaillé en vérifiant si une telle clé existe avec containsKey(). Je suspecte l'utilisation d'une référence faible aux résultats de la base de données. Pas exactement sûr. Juste ajouter une solution de contournement ici pour cette erreur étrange.