Java 예외 처리 (try-catch)
요약
Java 예외 처리의 핵심인 try-catch 구문과 throw, throws 키워드를 알아봅니다. 정보처리기사 실기에 출제된 예외 처리 문제를 풀기 위한 핵심 개념을 정리합니다.
예외 처리 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| try | 예외가 발생할 수 있는 코드를 감싸는 블록 | try { ... } |
| catch | 예외가 발생했을 때 실행되는 블록 | catch (Exception e) { ... } |
| finally | 예외 발생 여부와 관계없이 항상 실행 | finally { ... } |
| throw | 예외를 직접 발생시키는 키워드 | throw new Exception(); |
| throws | 메서드가 예외를 던질 수 있음을 선언 | void f() throws Exception |
| 다중 catch | 예외 종류별로 다르게 처리 | catch (ArithmeticException e) |
예외란? 쌩기초
예외 (Exception)란 프로그램 실행 중에 발생하는 오류입니다. 예를 들어, 0으로 나누거나, 배열 범위를 벗어나거나, null 값에 접근하는 경우 등이 있습니다.
예외가 발생하면 프로그램이 비정상 종료됩니다. 이를 방지하기 위해 예외 처리(Exception Handling)를 사용합니다.
try-catch 구문 쌩기초
try-catch는 예외가 발생할 수 있는 코드를 안전하게 실행하는 구문입니다.
동작 원리
try블록의 코드를 실행합니다- 예외가 발생하지 않으면:
catch블록을 건너뛰고 다음 코드를 실행합니다 - 예외가 발생하면:
try블록의 나머지 코드를 건너뛰고,catch블록을 실행합니다
try-catch의 반환값 기초
메서드 안에서 try-catch를 사용할 때, try와 catch 모두 return을 가질 수 있습니다. 예외 발생 여부에 따라 다른 값을 반환합니다.
이 패턴은 람다 표현식과 함께 출제된 적이 있습니다.
finally 블록 기초
finally는 예외 발생 여부와 관계없이 항상 실행되는 블록입니다. try-catch 뒤에 붙여서 사용합니다.
try-catch-finally 실행 흐름
예외가 발생하지 않는 경우:
예외가 발생하는 경우:
| 상황 | try | catch | finally |
|---|---|---|---|
| 예외 없음 | 전체 실행 | 건너뜀 | 실행 |
| 예외 발생 | 예외 시점까지 실행 | 실행 | 실행 |
finally와 return
try나 catch 블록에서 return을 실행해도, finally는 return 전에 실행됩니다.
실행 순서를 단계별로 보면:
System.out.print("A")실행 → "A" 출력return "try"를 만남 → 반환할 값"try"를 정해둠 (아직 메서드를 빠져나가지 않음)- 메서드를 빠져나가기 전에
finally블록 실행 → "C" 출력 finally가 끝나면, 정해둔 값"try"를 반환
finally에서 return하면?
try에서 반환값을 정해두었더라도, finally에 return이 있으면 finally의 return이 새로운 반환값을 지정합니다. 앞서 정해둔 값은 버려집니다.
위 예시에서 catch가 없는 것은, try는 catch 없이 finally만 붙여서 사용할 수도 있기 때문입니다.
다중 catch 블록 기초
하나의 try에 여러 개의 catch 블록을 사용하여, 예외 종류에 따라 다르게 처리할 수 있습니다.
예외 매칭 순서
catch 블록은 위에서 아래로 순서대로 검사하며, 처음 일치하는 catch 블록만 실행됩니다.
구체적인 예외를 먼저 작성
Exception은 모든 예외를 포함하는 가장 넓은 범위의 예외입니다. ArithmeticException, ArrayIndexOutOfBoundsException 등은 모두 Exception의 하위 종류입니다. 따라서 catch (Exception e)는 어떤 예외든 잡을 수 있습니다. Exception을 먼저 작성하면 모든 예외가 여기서 잡혀서, 아래의 구체적인 catch는 도달할 수 없습니다.
자주 나오는 예외 종류
| 예외 | 발생 상황 | 예시 |
|---|---|---|
| ArithmeticException | 0으로 나눌 때 | 10 / 0 |
| ArrayIndexOutOfBoundsException | 배열 범위 초과 | arr[5] (크기 3인 배열) |
| NullPointerException | null에 접근할 때 | null.toString() |
| ClassCastException | 잘못된 타입 변환 | (String) new Object() |
| NumberFormatException | 숫자 변환 실패 | Integer.valueOf("abc") |
throw 키워드 심화
throw 는 예외를 직접 발생시키는 키워드입니다. 개발자가 특정 조건에서 의도적으로 예외를 만들 수 있습니다.
throw와 try-catch 함께 사용
throw로 예외를 발생시키면, 해당 코드를 감싸는 try-catch에서 잡을 수 있습니다.
throws 키워드 심화
throws 는 메서드 선언부에 사용하여, 이 메서드가 예외를 던질 수 있음을 알리는 키워드입니다. 예외를 직접 처리하지 않고, 호출한 쪽에서 처리하도록 넘기는 것입니다.
throws가 선언된 메서드를 호출하는 쪽에서는 반드시 try-catch로 감싸거나, 자신도 throws를 선언해야 합니다.
throw vs throws 비교
| 키워드 | 위치 | 역할 | 예시 |
|---|---|---|---|
| throw | 메서드 본문 안 | 예외를 직접 발생시킴 | throw new Exception(); |
| throws | 메서드 선언부 | 예외를 던질 수 있음을 선언 | void f() throws Exception |
throw와 throws, 왜 s 하나 차이일까?
영어 문법 차이입니다. throw는 동사 원형(명령문)으로 "예외를 던져라"라는 뜻이고, throws는 3인칭 단수형(선언문)으로 "이 메서드는 예외를 던진다"라는 뜻입니다. 영어에서 "I throw" vs "He throws" 같은 차이입니다.