Comment obtenir le texte d'une trace de pile d'exception en Java MOI?


En Java normal, vous pouvez obtenir le texte d'une trace de pile en passant un PrintWriter à printStackTrace. J'ai le sentiment de connaître la réponse à cela (c'est-à-dire "Non") mais,

Existe-t-il un moyen d'obtenir le texte d'une trace de pile dans JavaME sous forme de chaîne?

Mise à Jour:

Je devrais mentionner que je suis limité à CLDC 1.0

Author: Lucifer, 2008-10-22

5 answers

AFAIK il n'y a aucun moyen d'obtenir la trace de pile en tant que valeur de chaîne, sauf si une plate-forme spécifique fournit un moyen de remplacer le système par défaut.err flux. Sur la plate-forme BlackBerry, il jette la trace de pile sur catch(Exception) afin d'économiser de la mémoire, mais il ne le fait pas sur catch(Throwable) et donne accès à la trace de pile via le journal des événements de l'appareil.

Ce que j'ai fini par faire est d'attraper Throwable plutôt que l'exception au dernier moment possible et d'imprimer la trace de la pile à partir de y. Cela a bien sûr le danger que vous attrapiez également java.lang.Error, ce qui n'est pas très bon, surtout si c'est OutOfMemoryError, bien qu'un appel à System.gc() avant d'imprimer la trace de la pile semble réduire le risque et nous n'avons eu aucun problème avec cela.

Je regarderais n'importe quelle plate-forme que vous ciblez et voir si elles donnent accès au système.tre quelque part. Vous pouvez toujours connecter un débogueur et il devrait apparaître sur la sortie de la console, bien qu'il semble que vous soyez après avoir obtenu des traces de pile dans le champ'.

 2
Author: roryf, 2008-10-22 14:00:18

Deux solutions:

  • Reproduisez l'exception sur l'émulateur. la boîte à outils sans fil et Netbeans imprimeront des traces de pile sur votre ordinateur.

  • Utilisez un appareil Symbian.

Avant le Feature Pack 2 de la Série 60 3ème édition, les combinés Symbian utilisent la machine virtuelle java Sun Hotspot. Il a été adapté à Symbian OS en le liant à une implémentation partielle de la bibliothèque standard C.

Cela a permis à Symbian de créer un programme C++ appelé redirecteur, qui était capable de capturer la sortie standard de la machine virtuelle et l'erreur standard, y compris les traces de pile d'exceptions java.

Le redirecteur c++ n'a jamais été mis à niveau pour la version 9 de Symbian OS. Au lieu de cela, un protocole GCF" redirect:// " a été introduit dans la machine virtuelle,

À partir d'un MIDlet séparé, ouvrez un InputStream à partir de la connexion renvoyée par Connector.ouvrir ("redirect://", Connecteur.LIRE); vous pouvez ensuite capturer des traces de pile d'exceptions sur les téléphones Symbian.

MODIFIER: "redirect://" est de retour dans Series60 5th edition et "redirect: / / test" devrait fonctionner sur Series60 3rd edition feature pack 2

 3
Author: michael aubert, 2009-02-25 14:32:28

Je ne pense pas qu'il y ait un moyen de le faire dans CLDC 1.0. Cependant, sur certains périphériques/systèmes d'exploitation, la classe d'exception sous-jacente peut fournir un moyen d'accéder à la trace de la pile (pensez aux versions CLDC plus récentes). Inspectez simplement l'instance d'exception lors de l'exécution à l'aide de reflection pour voir quels membres elle expose sur vos plates-formes cibles. Vous pouvez ensuite écrire du code qui sera en mesure d'extraire en toute sécurité la trace de la pile sur les plates-formes qui offrent de telles informations.

 0
Author: Alexander, 2008-10-22 13:40:24

J'ai créé un outil qui peut être utilisé pour enregistrer les traces de pile appropriées également dans CLDC. Découvrez-le à http://jarrut.sourceforge.net . C'est encore très nouveau et il pourrait avoir des aspérités, mais cela fonctionne pour moi et je ne pouvais plus imaginer développer des MIDlets sans cela. Meilleure façon de l'utiliser est de le combiner avec microlog.

Unfotunately l'outil nécessite actuellement CLDC 1.1 donc il pourrait ne pas résoudre le problème pour l'affiche d'origine.

 0
Author: Olli Kallioinen, 2010-07-06 14:09:28

Vous pouvez demander à PrintWriter d'écrire dans un ByteArrayOutputStream et de reconstruire la chaîne à partir des octets.

try{
    throw new Exception("Message");     
} catch (Exception ex){
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ex.printStackTrace(new PrintStream(out));
    System.out.println(new String(out.toByteArray()));
}

Ce n'est pas joli, mais ça devrait marcher un peu partout. Avant d'essayer ce qui précède, assurez-vous que vous n'avez pas accès à [Throwable#getStackTrace](http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace()), Eclipse prétend qu'il est disponible dans CDC / Foundation 1.1, mais cela ne dit rien sur les autres profils.

 -2
Author: Aaron Maenpaa, 2008-10-22 12:21:45