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와 관련된 정보가 없어진 것을 보았다.이상은 자바 창고의 궤적에 관한 제가 이전에 파악하지 못한 내용들입니다. 메모해 두세요.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.