CodeGym /행동 /JAVA 25 SELF /스택 트레이스 (Stack Trace)

스택 트레이스 (Stack Trace)

JAVA 25 SELF
레벨 11, 레슨 5
사용 가능

1. 소개

Stack Trace(스택 트레이스)는 오류(예외)가 발생하기까지 여러분의 프로그램에서 호출된 메서드들의 목록입니다. 프로그램에서 예외가 발생하면 Java는 스택 트레이스를 자동으로 화면에 출력합니다. 이는 “눈 위에 난 발자국”과 같아서, 프로그램이 어떤 순서로 오류에 이르렀는지 볼 수 있습니다.

비유:
미로를 걷다가 벽에 부딪힌 상황을 떠올려 보세요. 스택 트레이스는 길을 잃기 전에 어떤 복도를 지나왔는지를 보여 주는 지도입니다.

Stack Trace는 어떻게 생겼나요?

프로그램에서 오류가 발생하면 Java는 대략 다음과 같은 메시지를 출력합니다:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.divide(Main.java:10)
    at Main.main(Main.java:5)

여기에는 무엇이 적혀 있나요?

  • Exception in thread "main" — 어떤 스레드에서 오류가 발생했는지를 나타냅니다(보통 "main").
  • java.lang.ArithmeticException: / by zero — 예외 유형과 그 메시지입니다.
  • at Main.divide(Main.java:10) — Main 클래스의 divide 메서드, 10번째 줄.
  • at Main.main(Main.java:5) — Main 클래스의 main 메서드, 5번째 줄.

각 at ... 줄은 호출 스택의 한 단계입니다. 맨 위의 줄이 오류가 실제로 발생한 위치입니다. 그 아래에는 그 메서드를 호출한 메서드들이, 프로그램의 시작점까지 거슬러 올라가며 나타납니다.

2. Stack Trace 읽는 법

1단계. 예외 유형과 메시지를 확인합니다

첫 번째 줄에는 항상 오류 유형과 그 설명이 포함됩니다:

java.lang.ArithmeticException: / by zero

이것만으로도 힌트를 얻을 수 있습니다. 오류는 0으로 나누기에 관련되어 있습니다.

2단계. 첫 번째 "at ..." 줄을 확인합니다

여기가 오류가 실제로 발생한 위치입니다:

at Main.divide(Main.java:10)

즉, Main 클래스의 divide 메서드, 10번째 줄에서 오류가 발생했습니다.

3단계. 스택을 위로 따라 올라갑니다

다음 줄은 누가 이 메서드를 호출했는지를 보여 줍니다:

at Main.main(Main.java:5)

즉, main 메서드가 divide를 호출했고, 예외가 위로 전파된 것입니다. 줄 번호는 5입니다.

4단계. 내 클래스를 찾습니다

긴 스택 트레이스에는 종종 시스템 메서드들이 포함됩니다(예: java.util, java.io 패키지).
여러분의 클래스는 보통 목록의 앞쪽에 더 가깝습니다. 클래스와 파일 이름을 보고, 여러분의 코드를 먼저 찾아보세요!

3. 예시: 실제 Stack Trace 분석

코드:

public class Main 
{
    public static void main(String[] args) 
    {
        int result = divide(10, 0);
        System.out.println("결과: " + result);
    }

    public static int divide(int a, int b) 
    {
        return a / b;
    }
}

오류:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.divide(Main.java:8)
    at Main.main(Main.java:3)

해설:

  • 오류: 0으로 나누기 (ArithmeticException).
  • divide 메서드의 8번째 줄에서 발생했습니다.
  • main 메서드(3번째 줄)에서 호출되었습니다.

무엇을 하면 되나요?
Main.java 파일을 열고 8번째 줄을 확인하세요 — 0으로 나누는 코드를 찾고 수정합니다!

4. 여러 메서드가 포함된 Stack Trace

코드:

public class Main 
{
    public static void main(String[] args) 
    {
        process();
    }

    public static void process() 
    {
        calculate();
    }

    public static void calculate() 
    {
        int[] arr = {1, 2, 3};
        System.out.println(arr[10]); // 오류!
    }
}

오류:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
    at Main.calculate(Main.java:11)
    at Main.process(Main.java:7)
    at Main.main(Main.java:3)

해설:

  • 오류: 배열 인덱스 범위를 벗어남 (ArrayIndexOutOfBoundsException).
  • calculate에서 발생(줄 11).
  • process에서 호출(줄 7).
  • main에서 호출(줄 3).

결론:
스택 트레이스는 프로그램이 오류에 이르기까지 지나온 전 과정을 보여 줍니다.

5. Stack Trace를 다룰 때 흔한 실수

오류 №1: Stack Trace를 무시함.
초보자는 종종 “빨간 에러”만 보고 호출 스택을 읽지 않습니다. 그러지 마세요! Stack trace는 버그를 어디에서 찾아야 하는지 알려 주는 힌트입니다.

오류 №2: 오류 설명 줄과 오류 발생 위치 줄을 혼동함.
중요: 첫 번째 줄은 오류 유형이고, 오류가 발생한 위치는 첫 번째 at ... 줄에 있습니다.

오류 №3: 시스템 클래스에서 오류를 찾으려 함.
at java.base/java.util.Scanner.nextInt(Scanner.java:123) 같은 줄이 보이더라도, 서둘러 Java 소스 내부로 들어가지 마세요. 여러분의 코드에서 누가 그 메서드를 호출했는지 확인하세요.

오류 №4: 줄 번호를 활용하지 않음.
줄 번호는 최고의 친구입니다. 파일을 열어 해당 줄을 찾으면 — 오류가 보입니다.

오류 №5: Stack Trace가 “경로”라는 점을 이해하지 못함.
스택 트레이스는 프로그램이 어떻게 오류에 이르렀는지를 보여 줍니다. 버그가 맨 위 줄의 코드가 아니라, 메서드를 호출한 방식에 있을 때도 있습니다.

1
과제
JAVA 25 SELF, 레벨 11, 레슨 5
잠금
요리 계산기와 그 불쾌한 놀라움 🥧
요리 계산기와 그 불쾌한 놀라움 🥧
1
과제
JAVA 25 SELF, 레벨 11, 레슨 5
잠금
영웅과 인벤토리에 없는 유물 🏹
영웅과 인벤토리에 없는 유물 🏹
1
과제
JAVA 25 SELF, 레벨 11, 레슨 5
잠금
코드 탐정: 보고서 시스템 장애 조사 📉
코드 탐정: 보고서 시스템 장애 조사 📉
1
과제
JAVA 25 SELF, 레벨 11, 레슨 5
잠금
심층 탐구: 다계층 시스템에서의 장애 분석 🪆
심층 탐구: 다계층 시스템에서의 장애 분석 🪆
1
설문조사/퀴즈
예외, 레벨 11, 레슨 5
사용 불가능
예외
예외
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION