1. Méthodes d'impression des pistes de pile
Appelez activement l'un des objets Throwable de PrintstackTrace () = printStackTrace (System.err), PrintstackTrace (PrintStream) et PrintstackTrace (Printwriter).
Si une exception n'est pas traitée, lance directement après la méthode principale, l'exception PrintStackTrace () sera appelée avant la sortie du programme, et finalement l'exception dans le thread "Main" + printstackTrace ()
2. Piste de pile
1. printStackTrace ()
Tout d'abord, il est nécessaire de clarifier que cette méthode ne provient pas de la classe d'exception. À l'exception de la définition de plusieurs constructeurs, toutes les méthodes sont héritées de leur classe parent. Les méthodes liées aux exceptions sont héritées de la classe java.lang.throwable. PrintstackTrace () est l'un d'eux.
Cette méthode imprime les informations de piste de pile de l'objet jetable au flux de sortie d'erreur standard. La sortie ressemble à ceci:
java.lang.nullpointerException sur myclass.mash (myclass.java:9) sur myclass.crunch (myclass.java:6) sur myclass.main (myclass.java:3)
La première ligne de sortie est la sortie de la méthode toString (). Nous parlerons de cette méthode plus tard.
Voyons un exemple ci-dessous:
classe publique TestPrintStackTrace {public static void f () lance une exception {New Exception ("Il y a quelque chose de mal!");} public static void g () lance l'exception {f (); ) {try {g ();} catch (exception e) {e.printStackTrace ();La sortie de cet exemple est la suivante:
java.lang.Exception: quelque chose s'est mal passé! sur TestPrintStackTrace.f (TestPrintStackTrace.Java:3) sur TestPrintStackTrace.g (TestPrintStackTrace.Java:6) sur TestPrintStackTrace.main (TestPrintStack Trace.Java:10)
Dans cet exemple, une exception est lancée dans la méthode f (), une méthode f () est appelée dans la méthode g (), une exception est prise dans la méthode principale et une information de piste de pile est imprimée. Par conséquent, la sortie montre le processus de flly> g−> Main à son tour.
2. Méthode getStackTrace ()
Cette méthode fournit un accès programmatique aux informations imprimées par la méthode PrintstackTrace (). Il renvoie un tableau d'éléments de piste de pile. La sortie ci-dessus est un exemple. Enregistrez ces éléments de piste de pile dans un tableau. Chaque élément correspond à un cadre de pile. Le premier élément du tableau enregistre l'élément supérieur de la pile, qui est le F ci-dessus. L'élément inférieur du dernier élément enregistré.
Voici un exemple d'utilisation de getStackTrace () pour accéder à ces éléments de pile de piste et imprimer la sortie:
classe publique TestPrintStackTrace {public static void f () lance une exception {New Exception ("Il y a quelque chose de mal!");} public static void g () lance l'exception {f (); ) {try {g ();} catch (exception e) {e.printstackTrace (); -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------- ------ - "); for (stackTraceElement elem: e.getStackTrace ()) {System.out.println (elem);}}}}Une telle sortie est fondamentalement la même que la sortie de printstackTrace (), comme suit:
java.lang.Exception: quelque chose s'est mal passé! sur testprintstacktrace.f (testprintstacktrace.java:3) sur testprintstacktrace.g (testprinttacktrace.java:6) sur testprintstacktrace.main (testPrintStackTrace.Java:10)TestprintStackTrace.f(TestPrintStackTraceTrace.Java:3)TestprintPrintPrace.GentPraceTrace.Java:3)TestprintPrintPrace.GentPraceTrace.Java:3)TestprintPrintPrace.GentPraceTrace. Java: 6) TestPrintStackTrace.Main (TestPrintStackTrace.Java:10)
Méthode Three.FillinstackTrace
La méthode Native FillinStackTrace () renverra un objet jetable, qui est créé en remplissant les informations actuelles de pile d'appels dans l'objet d'exception d'origine, de sorte que l'exception originale renvoyée est toujours l'exception d'origine.
La ligne qui appelle cette méthode deviendra le nouvel emplacement exceptionnel, et des informations sur le point d'occurrence d'exception d'origine seront perdues. Son effet équivaut à assister à une exception et à reconstituer une autre exception. La différence entre les deux est que l'exception après FILLINSTACKTRACE est toujours l'exception d'origine (manque de piste de pile); .
package com.jyz.study.jdk.exception; ); statique void test2 () {test3 ();} private static void test3 () {lancez new nullpointerException ("str is null"); Les informations de pile d'exception de 1 et 2 sont présentées sur la figure:
La différence est l'information de cela lui-même.
Informations de pile de 1
Exception dans Thread "Main" java.lang.nullpointerException: Str est null sur com.jyz.study.jdk.exception.fillinstacktrace.test1 (FillinstackTrace.java:2 0) sur com.jyz.study.jdk.exception.fillinstackTrace. Main (FillinstackTrace.java:13)
2 Informations sur la pile
Exception dans Thread "Main" java.lang.exception sur com.jyz.study.jdk.exception.fillinstacktrace.test1 (FillinstackTrace.java:21) à com.jyz.study.jdk .exception.fillinstacktrace.main (FillinStackTrace.Java : 13)