Java 예외 처리 — try·catch·finally

Java 예외 처리 — try·catch·finally

프로그램이 실행되는 동안 예상치 못한 일이 생기면, Java는 그 상황을 **예외(exception)**라는 객체로 표현해요. 예시로 파일을 열려는데 파일이 없다든지, 숫자를 0으로 나눈다든지 하는 일 말이죠. 예외를 어떻게 발생시키고, 어떻게 잡아서 대응하는지가 이 강의의 핵심이에요.

출처: Exceptions - Dev.java

예외란 무엇인가

Java는 오류와 그 밖의 특별한 상황을 처리하기 위해 예외를 사용해요. 예외가 발생하면 프로그램의 정상 흐름이 중단되고, 그 예외를 처리하는 코드로 제어가 넘어가요.

가장 기본적인 처리는 try, catch, finally 블록이에요. 위험한 동작을 try에 두고, 예외가 나면 catch에서 잡아 대응하며, finally는 예외 유무와 관계없이 항상 실행돼요.

try {
    FileReader reader = new FileReader("file.txt");
    // 파일을 읽는 코드
} catch (IOException e) {
    System.out.println("파일을 열 수 없어요: " + e.getMessage());
} finally {
    System.out.println("항상 실행되는 정리 코드");
}

예외 던지기

예외는 시스템이 만드는 것만 있는 게 아니에요. 내가 직접 예외를 발생시킬 수도 있어요. throw 키워드로 예외 객체를 던지면 돼요.

public void withdraw(double amount) {
    if (amount <= 0) {
        throw new IllegalArgumentException("출금액은 0보다 커야 해요");
    }
    // ...
}

체크드 vs 언체크드 예외

Java에는 예외 처리 강제 여부가 다른 두 종류가 있어요.

  • 체크드 예외(Checked exception) — 컴파일러가 반드시 처리하도록 강제해요. IOException 같은 게 대표적이에요. try-catch 또는 throws 선언이 필요해요.
  • 언체크드 예외(Unchecked exception) — 처리하지 않아도 컴파일은 되어요. 대부분 프로그래밍 오류(버그)를 나타내는 RuntimeException 계열이에요.

언체크드 예외가 "논란의 여지가 있다(the controversy)"고 불리는 이유도 여기 있어요. 어떤 예외를 체크드로 만들고 어떤 걸 언체크드로 둘지는 팀마다 설계 철학이 다르거든요. 이 강의는 그 주제를 별도 섹션으로 다뤄요.

정리하면, 발생한 예외를 try-catch로 잡고, 필요할 때 throw로 만들고, 체크드/언체크드 성격을 이해하는 것 — 이 세 가지가 Java 예외 처리의 뼈대예요.

더 알아보기