중앙정보기술인재개발원/JAVA

[JAVA] 예외 처리 | try ~ catch

soidev 2025. 4. 7. 18:11

✅ 기본 문법 구조

try {
    // 예외 발생 가능성 있는 코드
} catch (Exception e) {
    // 예외 처리
} finally {
    // 예외와 관계없이 항상 실행되는 코드 (자원 정리 등)
}

🧩 각 부분 설명

📍 예외클래스타입 (catch 괄호 안의 첫 번째)

  • 어떤 종류의 예외를 잡을 것인지 지정하는 부분
  • 자바에는 Exception을 상속받은 다양한 예외 클래스들이 있음
  • 예시:
    • ArithmeticException: 0으로 나누기 같은 산술 예외
    • NumberFormatException: 문자열을 숫자로 바꾸는 데 실패할 때
    • NullPointerException: null 값을 잘못 참조할 때
    • IOException: 입출력 오류가 발생했을 때
    • Exception: 모든 예외의 최상위 타입 (모든 예외를 catch할 수 있음)

📍 변수명 (두 번째)

  • 예외 객체를 받아서 사용할 이름
  • 일반적으로 e, ex, err처럼 짧게 많이 사용
  • 이 변수로 예외 메시지나 스택 트레이스를 확인 가능

✅ 예외 처리 순서 & 원리

catch(NullPointerException e) { ... }
catch(IndexOutOfBoundsException e) { ... }
catch(Exception e) { ... }

이 순서가 중요한 이유:

  • 자바는 위에서부터 catch 블록을 차례로 검사해서,
  • 해당 예외와 일치하는 타입이 나오면 거기서 처리하고 나머지는 무시함.
  • 그래서 Exception(모든 예외의 부모)은 맨 아래에 둬야 함

📌 예외 클래스는 상속 관계이기 때문에, 부모 타입이 위에 오면 자식 타입은 도달할 수 없는 코드가 돼서 컴파일 에러가 난다

💡 예외 처리의 핵심 개념

  • try-catch는 **코드에서 컨트롤할 수 없는 상황(예외)**에 대해 프로그램을 멈추지 않고 흐름을 제어하기 위한 수단.
  • Exception 클래스는 모든 예외의 부모 클래스라서 catch(Exception e)는 거의 모든 예외를 잡을 수 있음 (마지막 보루 같은 느낌).
  • 대부분의 예외는 논리적으로 처리 가능한 경우가 많음 → 그렇기에 try-catch를 잘 써야 "안정성 확보"가 됨.

✨ 추가 팁

  1. e.printStackTrace() → 예외 발생 위치와 원인을 자세히 로그로 찍어줌 (개발 중에 유용!)
  2. e.getMessage() → 예외 메시지 간단히 확인
  3. 실무에서는 로깅 라이브러리(예: log4j, slf4j 등)로 예외 로그를 남김

✅ 1. 예외 전가 (throws)

📌 개념

예외 전가는 말 그대로 **예외 처리를 현재 메서드에서 하지 않고 호출한 쪽으로 "넘긴다"**는 의미

public void doSomething() throws Exception {
    // 여기서 예외가 날 수도 있다는 걸 호출자에게 알림
    throw new Exception("뭔가 잘못됐어");
}

📌 예시

public class Test {
    public static void main(String[] args) {
        try {
            riskyMethod(); // 예외를 직접 처리해야 함
        } catch (Exception e) {
            System.out.println("예외 처리함: " + e.getMessage());
        }
    }

    public static void riskyMethod() throws Exception {
        throw new Exception("위험한 메서드야!");
    }
}

💡 언제 쓰냐면?

  • 현재 메서드에서 예외를 처리하지 않고, 나를 호출한 메서드에게 책임을 넘기고 싶을 때
  • 보통 라이브러리, API, 또는 테스트 코드에서 자주 사용

✅ 2. 예외 직접 만들기 (사용자 정의 예외)

📌 개념

Java는 기본적으로 Exception과 그 하위 클래스를 제공하지만, 상황에 맞는 예외를 직접 정의할 수도 있음

📌 예시

class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}
public class Main {
    public static void main(String[] args) {
        try {
            checkAge(15);
        } catch (MyCustomException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }

    public static void checkAge(int age) throws MyCustomException {
        if (age < 18) {
            throw new MyCustomException("18세 미만은 가입할 수 없습니다.");
        }
        System.out.println("가입 가능!");
    }
}

💡 언제 쓰냐면?

  • 기본 제공 예외로는 상황을 정확히 표현할 수 없을 때
  • 예: NotEnoughMoneyException, InvalidPasswordException 같은 상황별 예외가 필요할 때

'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글

[JAVA] Thread,쓰레드  (1) 2025.04.08
[JAVA] 람다식(Lamda)  (0) 2025.04.07
[JAVA] 인터페이스  (0) 2025.04.07
[JAVA] Linked List  (3) 2025.04.01
[JAVA] 상속, 다형성  (0) 2025.03.27