dev.syw

try-catch-finally, checked/unchecked, throw/throws, try-with-resources를 다룬다.

예외 처리

프로그램 실행 중에는 예상치 못한 문제가 생길 수 있습니다. 파일이 없거나, 0으로 나누거나, null을 잘못 다루는 경우입니다. 예외 처리는 이런 상황을 잡아내 프로그램이 갑자기 멈추지 않도록 제어합니다.

학습 목표

  • try-catch-finally로 예외를 처리한다.
  • checked 예외와 unchecked 예외를 구분한다.
  • throwthrows로 예외를 던지고 위임한다.
  • try-with-resources와 사용자 정의 예외를 사용한다.

try-catch-finally

위험한 코드를 try에 두고, 예외가 발생하면 catch에서 처리합니다. finally는 예외 여부와 관계없이 항상 실행됩니다.

try {
    int result = 10 / 0;  // 예외 발생
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다");
} finally {
    System.out.println("처리 완료");  // 항상 실행
}

여러 예외를 각각 다르게 처리할 수 있습니다.

try {
    int[] arr = new int[3];
    arr[5] = 1;
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("범위를 벗어났습니다");
} catch (Exception e) {
    System.out.println("기타 오류: " + e.getMessage());
}

⚠️ 주의 — 여러 catch를 쓸 때는 더 구체적인 예외를 먼저 적어야 합니다. Exception 같은 상위 타입을 위에 두면 아래 catch가 실행되지 않습니다.

checked와 unchecked 예외

checked 예외는 컴파일러가 처리를 강제합니다(예: IOException). unchecked 예외는 RuntimeException의 하위로, 처리가 강제되지 않습니다(예: NullPointerException).

구분예시처리 강제
checkedIOException예 (try-catch나 throws 필요)
uncheckedNullPointerException, ArithmeticException아니오

throw와 throws

throw는 예외를 직접 발생시키고, throws는 메서드가 예외 처리를 호출자에게 위임함을 선언합니다.

static void checkAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("나이는 음수일 수 없습니다");
    }
}

static void readFile() throws IOException {
    // checked 예외를 throws로 위임
}

💡 TIP — 잘못된 인자가 들어왔을 때 IllegalArgumentException을 던지면, 문제를 조용히 넘기지 않고 명확히 알릴 수 있습니다.

try-with-resources

파일이나 연결처럼 사용 후 닫아야 하는 자원은 try 괄호 안에서 선언하면 자동으로 닫힙니다.

try (Scanner sc = new Scanner(System.in)) {
    String line = sc.nextLine();
    System.out.println(line);
}  // sc.close()가 자동 호출됨

finally에서 직접 닫는 것보다 간결하고 안전합니다.

사용자 정의 예외

상황에 맞는 예외를 직접 만들 수 있습니다. Exception이나 RuntimeException을 상속합니다.

public class InsufficientBalanceException extends RuntimeException {
    public InsufficientBalanceException(String message) {
        super(message);
    }
}

void withdraw(int amount, int balance) {
    if (amount > balance) {
        throw new InsufficientBalanceException("잔액이 부족합니다");
    }
}

요약

  • try-catch로 예외를 잡고 finally는 항상 실행됩니다.
  • checked 예외는 처리가 강제되고, unchecked 예외는 그렇지 않습니다.
  • throw로 예외를 발생시키고 throws로 처리를 위임합니다.
  • try-with-resources는 자원을 자동으로 닫습니다.
  • 의미 있는 사용자 정의 예외로 오류를 명확히 표현할 수 있습니다.

연습문제

  1. 0으로 나누는 코드를 try-catch로 감싸 예외 메시지를 출력하세요.
  2. 배열 범위를 벗어나는 접근을 처리하고 finally로 종료 메시지를 출력하세요.
  3. 나이가 음수면 IllegalArgumentException을 던지는 메서드를 작성하세요.
  4. RuntimeException을 상속한 사용자 정의 예외를 만들고 던져 보세요.

힌트 — 예외 메시지는 e.getMessage()로 얻습니다.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

Java” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.