- try ~ catch 문, throws문, 예외의 종류
1. 예외의 종류
- 일반 (컴파일 체크) 예외
- 예외 처리를 하지 않으면 컴파일 오류가 발생하여 꼭 처리해야하는 검사형 예외
- 실행 예외 (RuntimeException)
- 개발자 실수로 발생할 수 있으며, 예외 처리 하지 않아도 컴파일 가능한 비검사형 예외

2. 실행 예외 (RuntimeException)
- 예외 발생시 JVM은 해당하는 실행 예외 객체 생성
- 실행 예외는 컴파일러가 예외 처리 여부를 확인 x → 개발자가 예외 처리 코드의 추가 여부를 결정
Ex. 대표적 실행 예외
실행 예외 | 발생 이유 |
ArithmeticException | 0으로 나누기와 같은 부적절한 산술 연산을 수행할 때 발생 |
IllegalArgumentException | 메소드에 부적절한 인수를 전달할 때 발생 |
IndexOutOfBoundsException | 배열, 벡터 등에서 범위를 벗어난 인덱스를 사용할 때 발생 |
NoSuchElementException | 요구한 원소가 없을 때 발생 |
NullPointerException | null 값을 가진 참조 변수에 접근할 때 발생 |
NumberFormatException | 숫자로 바꿀 수 없는 문자열을 숫자로 변환하려 할 때 발생 |
3. 일반 예외
- 컴파일러는 발생할 가능성 발견시 컴파일 오류 발생
- 개발자는 예외 처리 코드를 반드시 추가
Ex. 대표적 일반 예외
일반 예외 | 발생 이유 |
ClassNotFoundException | 존재하지 않는 클래스를 사용하려고 할 때 발생 |
InterruptedException | 인터럽트 됐을 때 발생 |
NoSuchFieldException | 클래스가 명시한 필드를 포함하지 않을 때 발생 |
NoSuchMethodException | 클래스가 명시한 메서드를 포함하지 않을 때 발생 |
IOException | 데이터 읽기 같은 입출력 문제가 있을 때 발생 |
4. 예외 처리 2가지 방법
4-1. 예외 잡아서 처리


Throwable 클래스의 주요 메소드
메소드 | 설명 |
public String getMessage() | Throwable 객체의 자세한 메시지를 반환 |
public String toString() | Throwable 객체의 간단한 메시지를 반환 |
public void printStackTrace() | Throwable 객체와 추적 정보를 콘솔 뷰에 출력 |
Ex. 예제 1

특징
- 하나의 try 문에서 여러 개의 예외가 발생할 수 있지만 동시에 발생하지는 않음
- 하나의 예외가 발생하면 즉시 try 블록의 실행을 멈추고 해당 catch 블록으로 이동
- 예외 발생 여부와 관계없이 무조건 수할 실행문이 있다면 try~catch 문에 finally 블록 추가

Ex. 예제 2

다중 catch 블록일 때 catch 순서
- 다중 catch 블록일 때 try 블록에서 예외가 발생하면 발생한 예외를 catch 블록 순서대로 비교
- 앞에 있는 catch 블록의 예외 객체가 나중 catch 블록 예외 객체의 부모라면 앞에 있는 catch 블록이 먼저 가로챔 → 컴파일러는 오류를 발생시킴
- 구체적인 예외를 먼저 처리해야 함
Ex. 예제 3

try ~ with ~ resource 문
- try 블록에서 파일 등과 같은 리소스를 사용한다면 try 블록을 실행한 후 자원 반환 필요
- 리소스를 관리하는 코드를 추가하면 가독성도 떨어지고 개발자도 번거로움
- JDK7 부터는 예외 발생 여부와 상관없이 사용한 리소스를 자동 반납하는 수단 제공. 단, 리소스는 AutoCloseable의 구현 객체
- JDK 7과 8에서는 try()의 괄호 내부에서 자원 선언 필요
- JDK 9부터는 try 블록 이전에 자원 선언 가능. 단, 선언된 자원 변수는 사실상 final이어야 함

4-2. 예외 떠넘기기
- 메소드에서 발생한 예외를 내부에서 처리하기 부담스러울 때 thrwos 키워드를 사용해 예외를 상위 코드 블록으로 양도 가능

사용법
- 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김


주의사항
- throws 절이 있는 메소드를 오버라이딩 할 때는 메소드에 선언한 예외보다 더 광범위한 검사형 예외(일반 예외)를 던질 수 없음
- 부모 클래스의 메소드에 예외를 떠넘기는 throws 절이 없다면 자식 클래스의 메소드를 오버라이딩 할 때 어떤 예외도 떠넘길 수 없음
자바 API 문서 : 많은 메서드가 예외를 발생시키고 상위 코드로 예외 처리를 떠넘김
public static void sleep(long millis, int nanos) throws InterruptedException
Ex. 예제

Share article