1. Métodos para imprimir faixas de pilha
主动调用Throwable对象的printStackTrace()=printStackTrace(System.err),printStackTrace(PrintStream),printStackTrace(PrintWriter)中的其中一个。
如果一个Exception没有被处理,直接在main方法后面throws,程序退出前将调用异常的printStackTrace()方法,最终是Exception in thread "main" + printStackTrace()
2. Pilha de pilha
1. PrintStackTrace ()
Primeiro de tudo, é necessário esclarecer que esse método não vem da classe de exceção. Exceto pela definição de vários construtores, todos os métodos são herdados de sua classe pai. Os métodos relacionados a exceções são herdados da classe Java.lang.THOWLABLE. PrintStackTrace () é um deles.
Este método imprime as informações da pilha da pilha do objeto jogável para o fluxo de saída de erro padrão. A saída se parece com a seguinte:
java.lang.nullpointerException em myclass.mash (myclass.java:9) em myclass.crunch (myclass.java:6) em myclass.main (myclass.java:3)
输出的第一行是toString()方法的输出,后面几行的内容都是之前通过fillInStackTrace()方法保存的内容。 Falaremos sobre esse método mais tarde.
Vamos ver um exemplo abaixo:
public class TestPrintStackTrace { public static void f() throws Exception{ throw new Exception("There is something wrong!"); } public static void g() throws Exception { f(); } public static void main(String[] args ) {tente {g ();A saída deste exemplo é a seguinte:
java.lang.Exception: algo deu errado! at TestPrintStackTrace.f(TestPrintStackTrace.java:3) at TestPrintStackTrace.g(TestPrintStackTrace.java:6) at TestPrintStackTrace.main(TestPrintStackTrace.java:10)
在这个例子中,在方法f()中抛出异常,方法g()中调用方法f(),在main方法中捕获异常,并且打印栈轨迹信息。 Portanto, a saída mostra o processo de F -> G -> principal por sua vez.
2. Método getStackTrace ()
Este método fornece acesso programático às informações impressas pelo método PrintStackTrace (). Ele retorna uma variedade de elementos de pilha de pilha. A saída acima é um exemplo. Salve esses elementos da pilha em uma matriz. Cada elemento corresponde a um quadro de pilha. O primeiro elemento da matriz salva o elemento superior da pilha, que é o F acima. O elemento inferior do último elemento salvo.
Aqui está um exemplo de uso do getStackTrace () para acessar esses elementos da pilha de faixas e imprimir a saída:
public class TestPrintStackTrace { public static void f() throws Exception{ throw new Exception("There is something wrong!"); } public static void g() throws Exception { f(); } public static void main(String[] args ) {tente {g (); -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------- ---------- -"); para (StackTraceElement Elem: E.GetStackTrace ()) {System.out.println (elem);}}}}Essa saída é basicamente a mesma que a saída do PrintStackTrace (), como segue:
java.lang.Exception: algo deu errado! at TestPrintStackTrace.f(TestPrintStackTrace.java:3) at TestPrintStackTrace.g(TestPrintStackTrace.java:6) at TestPrintStackTrace.main(TestPrintStack Trace.java:10)TestPrintStackTrace.f(TestPrintStackTrace.java:3)TestPrintStackTrace.g(TestPrintStackTrace. java: 6) testPrintStackTrace.main (testPrintStackTrace.java:10)
Método Three.FillInstackTrace
native fillInStackTrace()方法将返回一个Throwable对象,它是通过把当前调用栈信息填入原来那个异常对象儿建立的,所以返回的还是原来的异常。
调用此方法的那一行将成为异常新的发生地,有关原来异常发生点的信息会丢失。 Seu efeito é equivalente a pegar uma exceção e refazer outra exceção. A diferença entre os dois é que a exceção após o FillInstacktrace ainda é a exceção original (apenas carece da pilha); .
pacote com.jyz.study.jdk.Exception; ); estático void test2 () {test3 (); As informações de pilha de exceção de 1 e 2 são mostradas na figura:
A diferença é a informação disso por si só.
Informações da pilha de 1
Exceção no thread "Main" java.lang.nullpointerException: str é nulo em com.jyz.study.jdk.exception.fillinstacktrace.test1 (FillInstacktrace.java:2 0) em com.jyz.study.jdk.exception.filinStackTrace. Main (FillInstackTrace.Java:13)
2 informações de pilha
Exceção no thread "main" java.lang.exception em com.jyz.study.jdk.exception.fillinstacktrace.test1 (FillInstackTrace.java:21) em com.jyz.study.jdk .exception.fillinstack.Main (FillinStackTrace.JavActAck.JAVCECCECTION.FILLINTACKTRACE.MAIN (FillinStack. : 13)