Skip to content

17 juin 2010 | Rédigé par Axon

25

Erreur Force Close : détecter l’erreur [Tutoriel Android n°4]

« The application XXXXX (process xxx.xxxx.xxxx) has stopped unexpectedly. Please try again. Force Close ». Tout programmeur Android est tombé ou tombera sur cette erreur. Nous allons voir aujourd’hui comment détecter l’exception qui c’est déclenchée.

Pour les pros du développement Android, cela va paraitre comme une évidence mais il m’a fallu tout de même quelques jours de recherche et de tâtonnement pour trouver la solution pour voir ce qui apparait habituellement dans la console JAVA, notamment les exceptions qui se sont lancées ou encore les System.out.println (toujours pratique pour faire des traces).

Prenons un exemple…

Créez un nouveau projet (si vous ne savez pas comment faire je vous invite à lire le tutoriel première application Android), et entrez le code suivant dans votre classe principale.

package com.tutomobile.android.tuto2;
 
import com.tutomobile.android.tuto2.R;
 
import android.app.Activity;
import android.os.Bundle;
 
public class Tutoriel2_Android extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        //un petit System.out.println pour voir s'il s'affiche bien
        System.out.println("Nous faisons exprès de faire apparaitre une exception !");
 
        //on crée un String
        String s = "Tuto Mobile";
 
        //et on essaye de convertir se String en entier (ce qui ne marchera pas évidemment)
        int i = Integer.parseInt(s);
    }
}

Lancez l’application et vous devriez tomber sur un écran de ce type :

Bon là l’exemple est simple donc on sait exactement où il y a un problème mais sur de grosse application avec plusieurs Activity cela peut poser problème. D’autant que là rien ne nous dit où se situe l’erreur, ni de quelle erreur il s’agit.

Utilisation du DDMS (Dalvik Debug Monitor Service)

Bien qu’il m’ai fallu quelques jours pour trouver ceci, la manipulation que je vais vous montrer se fait en un clic. Après avoir lancé votre application, il suffit de cliquer en haut à droite sur DDMS (avec un petit icône Android à côté, cf. screen ci-dessous), une fois ceci fait il ne reste plus qu’à visualiser les System.out.println et les exceptions qui se sont lancés dans l’onglet Log cat. Donc dans le screen que j’ai fait on voit bien en vert mon System.out.println et en rouge mon exception. L’exception java.lang.NumberFormatException correspond bien à ce que j’ai tenté de faire (convertir un String en int) et elle se situe bien dans la méthode onCreate() de la classe Tutoriel2_Android.java.

En résumé voilà une petite astuce qui pour certain paraîtra comme une évidence, mais qui peut en aider plus d’un! Enfin je crois… ;) Et comme toujours si vous avez des questions ou des remarques, n’hésitez pas à laisser un commentaire.

Découvrez d'autre articles de la catégorie Tutoriels Android

Encore un peu de lecture :

25 Commentaires Poster un commentaire
  1. Tite-Live
    18 juin 2010

    On a pas forcément besoin de ddms pour voir le logcat :) !

    Un petit adb logcat dans un terminal marchera aussi bien, et on peut appliquer autant de filtres qu’on veut (adb logcat | grep tutomobile par exemple)

  2. Axon
    18 juin 2010

    Oui j’avais vu ça quelque part sur le net mais je vais peut être paraitre idiot mais c’est quoi pour toi un terminal? car j’ai jamais réussi à faire marcher la commande adb logcat donc à mon avis je dois mal faire quelque chose… :)

  3. Tite-Live
    18 juin 2010

    En fait terminal c’est le nom utilisé sous Linux, on parle plutôt de ligne de commande sous Windows. (Windows R -> cmd -> Ok)
    Adb est un outil intégré au sdk android, il permet de presque tout faire par ligne de commande. Par contre il faut activer le débogage usb sur ton téléphone (Paramètres -> Applications -> Développement -> Débogage USB) (C’est normalement déjà fait si ton Hero est rooté)
    Sinon, une petite doc : http://www.droidforums.net/forum/droid-hacks/6865-how-use-adb-all-commands-options.html

  4. Axon
    18 juin 2010

    Donc si je comprend bien (arrête moi si je me trompe) une fois le débogage USB activé sur le tel on lance l’application sur son téléphone et on tape la commande adb logcat dans une fenêtre de ligne de commande Windows. c’est bien ça?

    Donc si j’ai bien compris, la commande abd logcat ne fonctionne pas lorsque l’on utilise l’émulateur et qu’on fais tourner l’application sur l’ordi?

    Si je suis à coté de la plaque ne m’en veut pas j’ai pas regardé en détail le lien que tu m’a filé !

  5. Tite-Live
    18 juin 2010

    Normalement, elle marche aussi avec l’émulateur.
    N’étant pas (encore?) un développeur mais seulement un bidouilleur, je n’ai jamais vérifié, mais dans la documentation du sdk ils expliquent comment le faire ( http://developer.android.com/guide/developing/tools/adb.html#devicestatus )

  6. Axon
    18 juin 2010

    je viens de réessayer vite fais, et il me dit que adb n’est pas reconnu en tant que commande interne ou externe, etc…

    Je pense que tu as raison sa doit marché mais ça m’embête de pas réussir :p

  7. Tite-Live
    18 juin 2010

    Awh il faut aller dans le répertoire où tu as extrait le sdk android d’abord :P
    Par exemple, si tu l’as extrait dans C:\android-sdk, adb se trouvera dans C:\android-sdk\tools donc tu devras d’abord te déplacer dans ce dossier avec « cd C:\android-sdk\tools\ » puis faire « adb logcat »

  8. Axon
    18 juin 2010

    je test ça demain et je te tiens au courant pour te dire si j’ai enfin réussi… en tout cas merci de ton aide mais je crois qu’on est sur la bonne voie…

  9. Axon
    18 juin 2010

    En fait je viens de le faire et ça marche merci beaucoup !!! C’était laborieux mais je suis parvenu à mes fins…

    Par contre même si c’est toujours bien de savoir le faire de cette manière, je trouve ça plus lisible dans Eclipse avec les couleurs et tout.

  10. 13 juil 2010

    Bonjour!
    Tout d’abord, super idée ce blog! Je débute également le développement sur Android et j’ai cherché un moment aussi ce LogCat! :)

    Par contre, un tout petit complément…Tu peux y avoir accès sans forcément passé dans l’environnement DDMS en cliquant dans le menu sur Window/Others/LogCat (de tête) dans l’espace de dév Java (je suis clair??).
    Cela ajoutera la fenêtre à coté de la console en bas :) Encore plus pratique pour avoir le code sous les yeux et l’erreur!

    Je vais lire la suite!
    @+

  11. 13 juil 2010

    Ah effectivement ton « astuce » est très pratique ! Merci à toi de l’avoir partagée. ;)

  12. Angel
    21 juil 2010

    Une autre méthode pour trouver une exception non gérée:

    Lancer l’appli en debug (Run->Debug), aller dans la perspective debug (Window->Open perspective->Debug). Le debugger va s’arreter automatiquement au moment où l’exception est lancée. Vous pourrez ainsi remonter la callstack et voir les valeurs de tous les objets.

    Si le debugger ne s’arrete pas, il est peut-être pas correctement configuré, pour cela, aller dans Run->Add java exception BreakPoint et choisissez les exceptions qui vous intéressent

  13. dawadam
    20 oct 2010

    Intéressent tout ça.
    C’est agréable de voir ce qui ce passe dans son téléphone.
    J’ai lancé le mode développement usb, puis abp sur mon pc et je voie tout.
    Je précise qu’il faut aller dans le répertoire « tools » du sdk avec le terminal et lancer « ./adb logcat » (sous linux).
    J’ai aussi afficher ces logs en temps réel sous netbeans (avec filtrage pid c’est pratique).
    Par contre mon seul soucis à de faire une pause, par ce que même en cas d’erreur, des infos arrivent toujours et je n’arrive pas à lire correctement l’erreur.

  14. Gundam00
    2 déc 2010

    Si je peux me permettre,
    « Awh il faut aller dans le répertoire où tu as extrait le sdk android d’abord
    Par exemple, si tu l’as extrait dans C:\android-sdk, adb se trouvera dans C:\android-sdk\tools donc tu devras d’abord te déplacer dans ce dossier avec « cd C:\android-sdk\tools\ » puis faire « adb logcat » »
    En suivant les recommandation lors de l’installation du SDK, tu aurais du mettre le chemin dans le PATH Windows (chez toi : C:\android-sdk\tools\) … ce qui permet en étant dans cmd de taper directement adb logcat …

  15. ReedSmith
    17 jan 2011

    Top ce tuto, continue comme ça !!!

  16. inconnu259
    12 mar 2011

    J’ajouterai un truc qui me parait important :
    Faire des System.out.print() c’est bien, mais pas assez….
    On peut carrément indiquer des messages en tant qu’erreur qui s’afficheront en bleu, en tant que debug, en bleu ou en tant qu’indication : en vert.
    Avec un tag, qui permet ensuite de les filtré, et le message.
    Pour cela on utilise :
    Log plus le mode que l’on veut.
    exemple : on veut indiquer quelque chose pour le debug.
    Au lieu de faire : System.out.println(« On debug »);
    Il faut faire : Log.d(« Debug app », »On debug »);
    Ici le d veut dire debug. Dans le même genre on a :
    Log.d => debug (affiche en bleu)
    Log.e => erreur (affiche en rouge)
    Log.i => info (affiche en vert)
    Log.v => verbose (affiche en noir)
    Log.w => warning (affiche en jaune)

    Ensuite le premier paramètre est le tag. Cela permet de filtrer. Par exemple on peu filtrer tout les « Debug app ». Avec le DMS cela ouvre une nouvelle vue avec uniquement les log tager « Debug app ». C’est plus facile pour s’y retrouver.
    Enfin le second paramètre est le message à proprement dit.
    Pour un tuto sur comment détecté l’erreur, je trouvais dommage de ne parler que des System.out.print, qui ne sont pas très adapté dans ce cas là, car un outil plus puissant existe. Pour ma part je n’utilise que les logs.

  17. Mc Flurry
    2 mai 2011

    J’ai un gros soucis avec le logCat, il est vide et rien ne s’inscrit dedans, que ce soit les messages normaux de démarrage d’un simulateur ou les message log.d que j’ai inscrit dans mon code…

    Une piste de résolution?

  18. Mc Flurry
    2 mai 2011

    Résolu !

    Si quelqu’un a cette erreur il suffit de sélectionner le bon « device » sous eclipse, pour cela cliquez sur l’icône en forme de téléphone et choisissez l’émulateur que vous souhaiter afficher.

  19. 2 mai 2011

    @Mc Flurry : Yes tu as trouvé ta réponse ! ;) Merci d’avoir ajouté cette précision pour ceux qui rencontrent le même problème !

  20. himitcho
    5 mai 2011

    Bonjour
    merci pour le Tutorial et pour les avis précieuses des amis ,
    mais je suis un débutant en developpement android et je ne sais pas comment trouver l’exception dans « logcat » et comment la corriger sachant que j’ai le code suivant dans main.xml

    et dans MainActivity.java :

    package com.android.myapp;

    import java.io.IOException;

    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class MainActivity extends Activity {
    Button b1;
    TextView txt1;
    TextView txt2;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    b1 = (Button)findViewById(R.id.button1);
    txt1 = (Button)findViewById(R.id.editText1);
    txt2 = (Button)findViewById(R.id.editText2);
    b1.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
    HttpClient c=new DefaultHttpClient();
    HttpGet req=new HttpGet(« http://127.0.0.1/gad.php?login= »+txt1.getText()+txt2.getText());
    try {
    HttpResponse resp = c.execute(req);
    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    });
    }
    }

  21. 19 mai 2011

    Super merci pour ce tuto, je débute sous Android et dans sa programmation. Ca va m’aider, c’est la première chose qui m’a handicapé la console de sortie … Là maintenant ça cause.

  22. GodNRock
    12 juin 2011

    Une petite astuce pour les touts débutants d’Eclipse. Si la perspective DDMS n’est pas affichée par défaut dans votre fenêtre, affichez-la en faisant Windows > Open Perspective > Other > DDMS.
    Et voilà !

  23. Kowo
    7 avr 2012

    Merci beaucoup pour ce tutoriel, cependant lorsque je souhaite faire une deuxième table de la même en respectant bien le code j’ai une erreur :

    no such table ***** : while compiling SELECT * FROM *****

    J’ai essayé de trouver l’erreur mais impossible

  24. Nk54
    6 juin 2012

    Excellent tuto ! Comme le premier pour installer environnement de dév android !

    Par contre, lorsque je lance cette app en 1.6, elle s’execute directement, mais en 2.1 j’arrive sur le « bureau » android. Rien dans les menu. Comment executer l’app ? Merci d’avance

Trackbacks & Pingbacks

  1. Les tweets qui mentionnent Erreur Force Close : détecter l’erreur [Tutoriel Android n°4] | Tuto Mobile -- Topsy.com

Une question, une suggestion, une opinion? Partagez ce que vous pensez, laissez un commentaire.

(obligatoire)
(obligatoire)

Note: Votre adresse email ne sera jamais publiée.

Suivez les réponses aux commentaires