try-catch-finally, checked/unchecked, throw/throws, try-with-resources를 다룬다.
예외 처리
프로그램 실행 중에는 예상치 못한 문제가 생길 수 있습니다. 파일이 없거나, 0으로 나누거나, null을 잘못 다루는 경우입니다. 예외 처리는 이런 상황을 잡아내 프로그램이 갑자기 멈추지 않도록 제어합니다.
학습 목표
try-catch-finally로 예외를 처리한다.- checked 예외와 unchecked 예외를 구분한다.
throw와throws로 예외를 던지고 위임한다.- 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).
| 구분 | 예시 | 처리 강제 |
|---|---|---|
| checked | IOException | 예 (try-catch나 throws 필요) |
| unchecked | NullPointerException, 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는 자원을 자동으로 닫습니다.
- 의미 있는 사용자 정의 예외로 오류를 명확히 표현할 수 있습니다.
연습문제
- 0으로 나누는 코드를
try-catch로 감싸 예외 메시지를 출력하세요. - 배열 범위를 벗어나는 접근을 처리하고
finally로 종료 메시지를 출력하세요. - 나이가 음수면
IllegalArgumentException을 던지는 메서드를 작성하세요. RuntimeException을 상속한 사용자 정의 예외를 만들고 던져 보세요.
힌트 — 예외 메시지는
e.getMessage()로 얻습니다.
💡 연습문제 풀이
불러오는 중…
댓글 0
“Java” 강좌에 대한 댓글입니다.