2012-01-09 3 views
0

Notre application reçoit quelques rapports d'erreur par semaine avec cette erreur NullPointerException sur un onActivityResult(). Nous l'avons testé sur de nombreux téléphones et nous avons essayé de réparer notre code, mais nous recevons toujours des rapports de la console de développement.java.lang.NullPointerException lors de la recherche de l'étiquette d'appel?

Voici l'erreur:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1001, result=-1, data=Intent { dat=content://com.android.contacts/data/612 flg=0x1 (has extras) }} to activity {com.package.app/com.package.app.PhoneLog}: java.lang.NullPointerException 
at android.app.ActivityThread.deliverResults(ActivityThread.java:2536) 
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578) 
at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:3691) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at com.package.app.PhoneLog..onActivityResult(PhoneLog.java:555) 
at android.app.Activity.dispatchActivityResult(Activity.java:3934) 
at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
... 11 more 

Je pense qu'il ya erreur vient d'où nous obtenons l'étiquette d'appel de la onActivityResult() ci-dessous:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) 
      { 
       super.onActivityResult(requestCode, resultCode, data); 
       if (resultCode == RESULT_OK) { 
       switch(requestCode) { 
        case PICK_CONTACT: 
         // handle the contact result 


       Cursor c = getContact(data.getData()); 
         if (c.moveToFirst()) 
         { 
          String name = c.getString(c.getColumnIndex("display_name")); 
          String num = c.getString(c.getColumnIndex("data1")); 
          typeLabel = c.getString(c.getColumnIndex("data2")); 
          long l = c.getInt(c.getColumnIndex("contact_id")); 
          c.getString(c.getColumnIndex("custom_ringtone")); 


         //error is here Caused by: java.lang.NullPointerException    //at PhoneLog.onActivityResult(PhoneLog.java:555) 
          if(typeLabel.equals("1")) { 
           typeLabel = "Home"; 
           } else if(typeLabel.equals("2")) { 
            typeLabel = "Mobile"; 
            } else if(typeLabel.equals("3")) { 
             typeLabel = "Work"; 
            } else { 
             typeLabel = ""; 
            } 



          callerName.setText(name); 
          callerNum.setText(num); 
          setChosenContactId(l); 


         } 
        break; 
    } 
    } 
    } 
+0

pouvez-vous publier ce qui est en ligne PhoneLog.java: 555 \ – nandeesh

+0

La ligne 555 est 'if (typeLabel.equals (" 1 ")) {' – user961389

+0

Pourquoi ne pas simplement vérifier null à chaque si ou simplement faire la valeur par défaut action lorsque vous obtenez typelabel comme nulle. Certains contacts peuvent ne pas avoir de données2 – nandeesh

Répondre

0

Si la colonne « données2 » peut être nul cela explique l'exception. Un bon modèle est d'écrire les conditions

"1".equals(typeLabel) 

au lieu de

typeLabel.equals("1") 

parce que les anciens fonctionne aussi pour typeLabel == null.

+0

Donc, dois-je le recoder comme ceci: 'if (typeLabel == null) { typeLabel =" "; } else if ("1" .equals (typeLabel)) { typeLabel = "Accueil"; } else if ("2" .equals (typeLabel)) { typeLabel = "Mobile"; } else if ("3" .equals (typeLabel)) { typeLabel = "Travail"; } else { typeLabel = ""; } ' – user961389

+0

Si typeLabel étant null a provoqué l'exception alors cela résoudra le problème. Vous pouvez ignorer la première condition (vérifiez que typeLabel == null), car le cas chevauche l'else-path, et typeLabel étant null n'est pas un problème puisque equals() est appelé sur les littéraux de chaîne ("1", "2" "3"). – Stefan

0

changement à cet espoir, il fonctionnera

if (resultCode == RESULT_OK) { 
      switch(requestCode) { 
       case PICK_CONTACT: 
        // handle the contact result 

Cursor c = getContact(data.getData()); 
        c.moveToFirst(); 

         String name = c.getString(c.getColumnIndex("display_name")); 
         String num = c.getString(c.getColumnIndex("data1")); 
         typeLabel = c.getString(c.getColumnIndex("data2")); 
         long l = c.getInt(c.getColumnIndex("contact_id")); 
         c.getString(c.getColumnIndex("custom_ringtone")); 

         c.moveTonext(); 
        //error is here Caused by: java.lang.NullPointerException    //at PhoneLog.onActivityResult(PhoneLog.java:555) 
         if(typeLabel=="1")) { 
          typeLabel = "Home"; 
          } else if(typeLabel=="2")) { 
           typeLabel = "Mobile"; 
           } else if(typeLabel=="3")) { 
            typeLabel = "Work"; 
           } else { 
            typeLabel = ""; 
           } 



         callerName.setText(name); 
         callerNum.setText(num); 
         setChosenContactId(l); 



       break; 
} 
0

Peut-être que votre curseur est nulle? C'est si getContact (data.getData()); se bloque et renvoie null.

Je ne peux pas voir la mise en œuvre de la méthode, donc je ne peux pas être sûr, mais je suggérerais de vérifier la valeur NULL avant d'essayer d'accéder au curseur.

Questions connexes