1. 스택 트랙 인쇄 방법
Throwable Object의 PrintStackTrace () = PrintStackTrace (System.err), PrintStackTrace (PrintStream) 및 PrintStackTrace (PrintStackTrace) 중 하나를 적극적으로 호출하십시오.
예외가 처리되지 않으면 기본 메소드 직후에 버린 경우 프로그램이 종료되기 전에 예외 PrintStackTrace () 메소드가 호출되며 궁극적으로 스레드 "Main" + PrintStackTrace ()에서 예외가됩니다.
2. 스택 트랙
1. printstacktrace ()
우선,이 방법이 예외 클래스에서 나오지 않음을 명확히해야합니다. 여러 생성자를 정의하는 것을 제외하고 모든 방법은 부모 클래스에서 상속됩니다. 예외와 관련된 방법은 java.lang.throwable 클래스에서 상속됩니다. PrintStackTrace ()는 그 중 하나입니다.
이 메소드는 Throwable Object의 스택 트랙 정보를 표준 오류 출력 스트림에 인쇄합니다. 출력은 다음과 같습니다.
myclass.crunch (myclass.java:6)에서 myclass.mash (myclass.java:6)의 java.lang.nullpointerexception (myclass.java:3)
첫 번째 출력은 ToString () 메소드의 출력입니다. 나중에이 방법에 대해 이야기하겠습니다.
아래의 예를 보자 :
public class testprintstacktrace {public static void f () 예외 { "뭔가 잘못되었습니다!"} 공개 정적 void main (string [] args ) {try {g ()} catch (예외 e) {e.printstacktrace ()};이 예제의 출력은 다음과 같습니다.
java.lang.exception : 뭔가 잘못되었습니다! testprintstacktrace.g에서 testprintstacktrace.g (testprintstacktrace.java:3)에서 testprintstacktrace.g (testprintstacktrace.java:6)에서 testprintstacktrace.main (testprintstack trace.java:10)에서
이 예에서는 메소드 f ()에서 예외가 발생되며 메소드 f ()가 메소드 g ()에서 호출되고 주요 메소드에서 예외가 잡히고 스택 트랙 정보가 인쇄됩니다. 따라서 출력은 F (f) 메인의 프로세스를 차례로 보여줍니다.
2. getStacktrace () 메소드
이 메소드는 PrintStackTrace () 메소드에 의해 인쇄 된 정보에 대한 프로그래밍 방식 액세스를 제공합니다. 스택 트랙 요소의 배열을 반환합니다. 위의 출력이 예입니다. 각 줄 2-4 출력의 내용은 스택 트랙 요소에 해당합니다. 이 스택 트랙 요소를 배열에 저장하십시오. 각 요소는 스택 프레임에 해당합니다. 배열의 첫 번째 요소는 스택의 상단 요소 (위의 F)를 저장합니다. 마지막 요소의 하단 요소가 저장되었습니다.
다음은 GetStacktrace ()를 사용하여 이러한 트랙 스택 요소에 액세스하고 출력을 인쇄하는 예입니다.
public class testprintstacktrace {public static void f () 예외 { "뭔가 잘못되었습니다!"} 공개 정적 void main (string [] args ) {try {g ()} catch (예외 e) {e.printstacktrace (); --------------------------------------------------------- --------------------------------------------------------- --------------------------------------------------------- -------------------------------------------------------- -"); for (stackTraceElement elem : e.getStackTrace ()) {System.out.println (elem);}}}}이러한 출력은 기본적으로 다음과 같이 PrintStackTrace ()의 출력과 동일합니다.
java.lang.exception : 뭔가 잘못되었습니다! testprintstacktrace.f (testprintstacktrace.java:3)에서 testprintstacktrace.g (testprintstacktrace.java:6)에서 testprintstacktrace.main (testprintstack trace.java:10)testprintstacktrace.f에서 testprintstacktrace.f(TestPrintstacktrace.java:3)testprinttrace. Java : 6) testprintstacktrace.main (testprintstacktrace.java:10)
3.fillinstacktrace 메소드
기본 FillInstackTrace () 메소드는 현재 통화 스택 정보를 원래 예외 객체로 채워서 생성되는 던지기 가능한 객체를 반환하므로 반환 된 원본 예외는 여전히 원래 예외입니다.
이 방법을 호출하는 줄은 예외가 새로운 위치가되고 원래 예외 발생 지점에 대한 정보가 손실됩니다. 그 효과는 예외를 포착하고 또 다른 예외를 다시 던지는 것과 같습니다. 이 둘의 차이점은 FillInstackTrace 이후의 예외는 여전히 원래 예외입니다 (스택 트랙이 다시 발생하면 원래 예외 정보와 관련이 없습니다 (물론 스택 트랙은 없습니다). .
package com.jyz.study.jdk.except; / ** * 스택 트랙 * fillinstacktrace * @author [email protected] * / public ic static void main (Strows) 예외 {test1 )} 개인 정적 void test1 ()는 {treat2 () {nullpointerexception ex) {ex.fillinstacktrace (); static void test2 () {test3 ();
1과 2의 예외 스택 정보는 그림에 나와 있습니다.
차이점은 이것 자체의 정보입니다.
1의 스택 정보
스레드의 예외 "main"java.lang.nullpointerexception : str는 com.jyz.study.jdk.exception.fillinstacktrace.test1 (fillinstacktrace.java:2 0)에서 com.jyz.study.jdk.exception.fillinstacktrace에서 null입니다. main (fillinstacktrace.java:13)
2 스택 정보
스레드 예외 "main"java.lang.exception (com.jyz.study.jdk.except.fillinstacktrace.test1)에서 예외 : 13)