Java Exception stackTrace

java exception 발생경로를 볼수 있는 stackTrace를 분석해보자.

Exception의 최상위 클래스 Exception.java는 Throwable을 extends하고 있다.
Throwable클래스 에서 printStackTrace 메소드를 찾을수 있다.

printStackTrace()는 내부적으로 System.err stream을 넘기고 있다.
분서을 위해 printStackTrace(PrintStreamOrWriter s) 을 보자.

PrintStreamIrWriter s 변수 사용하는 것을 보면 아래 순서로 출력된다.

  1. s.println(this)
  2. getOurStackTrace() 를 loop돌면서 s.println(“\tat “ + traceElement);
  3. getSuppressed()를 loop돌면서 se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, “\t”, dejaVu);
  4. getCause() 가 null이 아니라면 ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, “”, dejaVu);

첫번째 println(this)는 각 Exception class가 toString을 override하지 않는다면 Throwable의 toString메소드에 따라 아래와 같은 로직으로 출력된다.

printStacTrace 최상단의 [Exception클래스명 : 메시지] 가 되겟다.

두번째 getOurStackTrace() 를 loop돌면서 출력하는 부분을보자.
getOurStackTrace()는 StackTraceElement배열을 리턴한다.
loop를 돌면서 [탭문자 + “at” + StackTraceElement.toString()] 를 출력한다.

StackTraceElement가 담는것은 제일 바깥으로 나오는 Exception의 stack들이 되겠다.

세번째 getSuppressed() 에서 suppressed Exception(java7추가)들을 가져와 출력하고

네번째 getCause() 에서는 chaing된 Throwable을 리턴하여 위와 같은 출력 로직을 실행해준다.

Exception을 발생시키는 로직으로 stactTrace를 확인해보자

변수 a가 null이기 때문에 NullPointerException이 발생한다.

stackTrace최상위에는 최상위 노출 Exception의 stack이 찍히고
이어진 Caused by : 로 어디서 부터 Exception이 발생되었는지 알 수 있다.
Suppressed : 에서는 java7 에 추가된 suppressed exception에 대한 정보를 볼수 있다.

stackTrace 는 위에서 부터 아래로 , 바깥 Throwable 부터 내부 Throwable로 출력됨을 알수있다.

맨 아래 caused by를 보자..
아…
 library나 framework 사용 시에는 원인이 되는 부분이 맨 아래 위치하지 않을수 있겠다.

ps..대충 정리한 감이 많이 든다…

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.