2010-12-02 4 views
1

Il s'agit en fait de deux questions. Le premier concerne mon programme, et le second est une question plus générale concernant le débogage.Comment interpréter les informations de débogage?

Dans mon code, j'ai deux boutons d'écoute. Quand on clique sur le premier, onClickListener crée le localisateur d'emplacement, ainsi que le LocationManager qui demande des mises à jour à partir du localisateur d'emplacement. (Voir ci-dessous ...)

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationlistener); 

Sur le clic du second bouton, j'essaie de désenregistrer l'auditeur comme suit ...

locationManager.removeUpdates (LocationListener);

Cependant, je me retrouve avec un proche de la force et les informations suivantes dans le débogueur ...

ERROR/AndroidRuntime(310): FATAL EXCEPTION: main 
ERROR/AndroidRuntime(310): java.lang.NullPointerException 
ERROR/AndroidRuntime(310):  at com.ryan.gcal.GRunCal$2.onClick(GRunCal.java:94) 
ERROR/AndroidRuntime(310):  at android.view.View.performClick(View.java:2408) 
ERROR/AndroidRuntime(310):  at android.view.View$PerformClick.run(View.java:8816) 
ERROR/AndroidRuntime(310):  at android.os.Handler.handleCallback(Handler.java:587) 
ERROR/AndroidRuntime(310):  at android.os.Handler.dispatchMessage(Handler.java:92) 
ERROR/AndroidRuntime(310):  at android.os.Looper.loop(Looper.java:123) 
ERROR/AndroidRuntime(310):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
ERROR/AndroidRuntime(310):  at java.lang.reflect.Method.invokeNative(Native Method) 
ERROR/AndroidRuntime(310):  at java.lang.reflect.Method.invoke(Method.java:521) 
ERROR/AndroidRuntime(310):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
ERROR/AndroidRuntime(310):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
ERROR/AndroidRuntime(310):  at dalvik.system.NativeStart.main(Native Method) 

Ligne 94 de mon code, où l'erreur provient, est où j'ai essayé de supprimer l'emplacement d'écoute . Donc, je suppose que je ne supprime pas l'écouteur de localisation correctement, mais je ne suis pas sûr de ce qui ne va pas. Mon LocationManager est déclaré au début de mon code ...

Locationmanager locationManager; 

Ma première question est, ce que je fais mal à enlever l'auditeur? Et d'autre part, quelqu'un peut-il fournir quelques conseils/astuces pour apprendre à interpréter les erreurs de débogage de manière significative? Merci.

+0

Comment avez-vous déclaré 'locationlistener'? – Asahi

+0

J'ai mis à jour la question pour inclure ma déclaration de locationlist – Ryan

+0

Vous devez montrer plus de détails, par exemple comment instancier votre locaionListener. Il semble également que votre formatage est foiré. Cela m'est arrivé l'autre jour, vous devez couper le message dans le bloc-notes, le modifier et remplacer toute la question. – Emile

Répondre

1

Vous devez soit:

A) définir l'instance LocationManager comme une variable de classe, ou le récupérer à nouveau dans votre onclick.

LocationManager locationManager; 

public void onClick1() 
{ 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationlistener); 

} 

public void onClick2() 
{ 
    locationManager.removeUpdates(locationlistener); 
} 

Vous devez vous assurer que dans onClick1() au lieu de

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

vous mettez

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

Spécification LocationManager LocationManager fait la portée de votre déclaration ci-jointe à la méthode de son assign dans, plutôt que dans le champ d'application de la classe. Cela signifie que dans votre 2ème clic, locationManager est infact null.

+0

Cela a fonctionné parfaitement. Je ne me suis pas rendu compte qu'en spécifiant à nouveau LocationManager je changerais la portée de la déclaration. Merci beaucoup pour votre aide Emile. Je vais essayer de nettoyer ma question ci-dessus un peu plus pour le clarifier pour les futurs utilisateurs. Merci encore. – Ryan

1

Répondez à votre deuxième question. Pour comprendre ce que toutes les exceptions et les erreurs signifient, il suffit de consulter la page de référence que vous pouvez trouver au http://d.android.com. En outre, le message d'exception/erreur est d'une grande aide car il vous dit ce qui a mal tourné la plupart du temps. Lorsque vous regardez une pile, vous voyez également le nom complet de la classe (nom de la classe incluant le nom du paquet) et la méthode dans laquelle l'exception s'est produite ou à partir de laquelle l'exception a été déclenchée et entre parenthèses vous retrouverez la classe nom et le numéro de ligne de code où l'exception a été levée.

+0

Ceci est utile, merci. Donc, pour mon exception, c'est une classcastexception ... Lancé lorsqu'un programme tente de transformer un objet en un type avec lequel il n'est pas compatible. Je l'ai déclaré en tant que LocationListener, pourquoi aurait-il besoin d'être refondu? – Ryan

+0

êtes-vous sûr que l'exception est causée par cette ligne? pouvez-vous poster l'ensemble stacktrace? – Asahi

+0

J'ai essayé de simplifier mon code et de tout mettre dans la même activité. Je reçois maintenant une exception nullpointer selon la publication éditée. – Ryan

1

Aller par explication Octaviens:

ERROR/AndroidRuntime(310): java.lang.NullPointerException 
ERROR/AndroidRuntime(310):  at com.ryan.gcal.GRunCal$2.onClick(GRunCal.java:94) 

moyens dans la méthode onClick définie dans votre classe GRunCal, plus précisément à la ligne 94, vous appelez le plus probablement une méthode sur une valeur nulle. Cela devrait être évident une fois que vous vérifiez votre code.

par exemple:

View myCustomComponent; 
public void onClick(View v) 
{ 
    myCustomComponent.doSomething();// Null pointer exception would be thrown. because myCustomComponent hasn't been assigned. 
} 

Vous pouvez mettre un point de rupture avant la ligne 94, puis de regarder les valeurs de votre méthode. Reculez à partir de là pour découvrir ce qui échoue réellement.

Après votre modification.

ERROR/AndroidRuntime(286): Caused by: java.lang.ClassCastException: android.content.Intent 

Je pense, mais je ne peux pas être sûr que cela soit causé par le genre de situation suivant.

public void onClick(View v) 
{ 
    Thread nonsense = (Thread)v; 
} 

dire que le code ci-dessus est un non-sens, assez sûr que vous ne pouvez pas lancer une vue comme un fil, mais le point est coulée quelque chose comme un autre type jetterait une telle erreur.

Questions connexes