Java 예외 스택 궤적(Stack Trace) 상세 정보 및 인스턴스 코드

Java 이상한 스택 궤적(Stack Trace) 상세 정보
이상을 포착할 때는 종종 약간의 처리가 필요하다.비교적 간단하고 직접적인 방법은 이상 스택 궤적 Stack Trace를 인쇄하는 것이다.창고 궤적을 말하자면 아마도 많은 사람들이 나와 마찬가지로 첫 번째 반응은 printStackTrace() 방법이다.사실 이 방법 외에 또 다른 내용도 창고 궤적과 관련이 있다.
     1.printStackTrace()
우선 이 방법은 Exception 클래스에서 나온 것이 아니라는 것을 명확히 해야 한다.Exception 클래스 자체는 몇 개의 구조기를 정의한 것을 제외하고 모든 방법은 그 부류에서 계승된 것이다.이상과 관련된 방법은 모두java에서 나온다.lang. Throwable 클래스에서 물려받았어요.printStackTrace()가 그 중 하나입니다.
이 방법은 Throwable 대상의 창고 궤적 정보를 표준 오류 출력 흐름에 출력합니다.출력의 대략적인 모양은 다음과 같다.

java.lang.NullPointerException
     at MyClass.mash(MyClass.java:9)
     at MyClass.crunch(MyClass.java:6)
     at MyClass.main(MyClass.java:3)
출력의 첫 번째 줄은 toString() 메서드의 출력이며, 뒷줄의 내용은 이전에 fillInStackTrace() 메서드를 통해 저장된 내용입니다.이 방법에 관해서 우리는 뒤에서 이야기할 것이다.
다음 예제를 살펴보겠습니다.

public class TestPrintStackTrace {
  public static void f() throws Exception{
    throw new Exception(" !");
  }
  public static void g() throws Exception{
    f();
  }
  public static void main(String[] args) {
    try {
      g();
    }catch(Exception e) {
      e.printStackTrace();
    }
  }
}
이 예제의 출력은 다음과 같습니다.

java.lang.Exception:  !
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:6)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:10)
이 예에서 방법 f()에서 이상을 던지고 방법 g()에서 방법 f()를 호출하여main 방법에서 이상을 포착하고 창고 궤적 정보를 출력합니다.따라서 출력은 f―>g―>main의 과정을 순서대로 보여 주었다.
    2.getStackTrace() 메서드
이 메서드는 인쇄된 printStackTrace() 메서드에 대한 프로그래밍 액세스를 제공합니다.그것은 창고 궤적 요소의 그룹을 되돌려줍니다.위의 출력을 예로 들면, 출력된 2-4줄의 모든 줄의 내용은 창고 궤적 요소에 대응한다.이 창고 궤적 요소를 하나의 그룹에 저장합니다.모든 요소가 창고에 대응하는 창고 프레임수조의 첫 번째 요소는 창고 꼭대기 요소, 즉 위의 f를 보존한다.마지막 요소가 저장된 창고 요소입니다.
다음은 getStackTrace()를 사용하여 이러한 트레일 스택 요소에 액세스하고 출력을 인쇄하는 예입니다.

public class TestPrintStackTrace {
  public static void f() throws Exception{
    throw new Exception(" !");
  }
  public static void g() throws Exception{
    f();
  }
  public static void main(String[] args) {
    try {
      g();
    }catch(Exception e) {
      e.printStackTrace();
      System.out.println("------------------------------");
      for(StackTraceElement elem : e.getStackTrace()) {
        System.out.println(elem);
      }
    }
  }
}
이러한 출력은 printStackTrace() 출력과 기본적으로 동일합니다.

java.lang.Exception:  !
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:6)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:10)
TestPrintStackTrace.f(TestPrintStackTrace.java:3)
TestPrintStackTrace.g(TestPrintStackTrace.java:6)
TestPrintStackTrace.main(TestPrintStackTrace.java:10)
   3.fillInStackTrace()
우리는 앞에서도 이 방법을 언급했다.이 방법을 분명히 말하려면 먼저 이상을 포착한 후에 다시 던지는 문제를 말해야 한다.catch 코드 블록에서 이상을 포착하여 창고 궤적을 인쇄하고 다시 throw합니다.이전 단계의 방법 호출에서 이 이상을 포착하고 창고 궤적 정보를 출력합니다.이 두 창고의 궤적 정보는 같을까요?코드를 살펴보겠습니다.

public class TestPrintStackTrace {
  public static void f() throws Exception{
    throw new Exception(" !");
  }
  public static void g() throws Exception{
    try {
      f();
    }catch(Exception e) {
      e.printStackTrace();
      throw e;
    }
     
  }
  public static void main(String[] args) {
    try {
      g();
    }catch(Exception e) {
      e.printStackTrace();
    }
  }
}
main 방법에서 포착된 이상은 g() 방법에서 나온 것이다. 이치대로 말하면 이 두 인쇄 창고의 궤적에 대한 정보는 다르고 두 번째 인쇄된 정보는 f에 대한 정보가 없을 것이다.그러나 사실상 두 번의 인쇄 창고 궤적 정보는 같다.출력 결과는 다음과 같습니다.

java.lang.Exception:  !
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
java.lang.Exception:  !
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
즉, 이상을 포착하면 즉시 던지고, 상급 방법 호출에서 다시 이 이상을 포착하면 인쇄된 창고 궤적 정보는 같다.현재 스레드의 현재 상태에 있는 트랙 스택의 상태를 Throwabe에 저장하지 않았기 때문입니다.이제 fillInStackTrace() 메서드를 도입합니다.이 방법이 마침 한 것은 바로 이런 보존 작업이다.이 방법의 원형을 살펴보자.

public Throwable fillInStackTrace()
이 방법은 되돌아오는 값이 있다.현재 스택 궤적 정보가 저장된 Throwable 객체가 반환됩니다.fillInStackTrace() 방법으로 처리한 후 인쇄된 스택 궤적 정보가 어떻게 다른지 살펴보겠습니다. 코드는 다음과 같습니다.

public class TestPrintStackTrace {
  public static void f() throws Exception{
    throw new Exception(" !");
  }
  public static void g() throws Exception{
    try {
      f();
    }catch(Exception e) {
      e.printStackTrace();
      // 
      throw (Exception)e.fillInStackTrace();
    }
     
  }
  public static void main(String[] args) {
    try {
      g();
    }catch(Exception e) {
      e.printStackTrace();
    }
  }
}
출력은 다음과 같습니다.

java.lang.Exception:  !
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:17)
java.lang.Exception:  !
  at TestPrintStackTrace.g(TestPrintStackTrace.java:11)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:17)
우리는 메인 방법에서 창고 궤적을 인쇄하는 데 f와 관련된 정보가 없어진 것을 보았다.
이상은 자바 창고의 궤적에 관한 제가 이전에 파악하지 못한 내용들입니다. 메모해 두세요.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기