예외
예외(exception)란 일반적이지 않는 상황을 의미한다.
자바는 자바 API를 사용하는 중에 발생할 수 있는 모든 예외에 대한 예외 클래스를 제공한다.
그리하여 실행 도중에 예외가 발생하면 JVM은 그것에 매칭되는 예외 클래스로부터 객체를 생성하여 예외를 발생시킨 코드에 던진다.
생성된 예외 객체는 try ~ catch 와 finally 블럭을 적절히 사용하면 예외를 컨트롤 할 수 있게 된다.
예외도 엄밀하게 에러이지만 자바에서는 에러와 예외를 구별한다.
자바에선 프로그램적으로 컨트롤 할 수 없는 에러가 에러다.
에러가 발생하면 프로그램은 종료된다.
예외 클래스들은 계층적인 구조를 가지는데, 이중 Exception 클래스는 모든 예외 클래스의 최상위 클래스이다.
예외를 컨트롤하는 코드
try {
..
// 예외가 발생할 수 있는 코드
..
} catch ( 잡을_익셉션클래스 익셉션변수명 ) {
// 예외가 발생했을 때 실행되는 코드
} catch ( 잡을_익셉션클래스 익셉션변수명 ) { // 위보다 계층적으로 상위에 있는 익셉션
// 예외가 발생했을 때 실행되는 코드
} finally { // 이 블록은 옵션
// 예외가 발생하던 안하던 무조건 실행되는 코드
}
try ~ catch블록
예외상황을 다루는 코드에서 반드시 있어야 되는 필수 요소이다.
에러와 마찬가지로 예외 역시 아무런 조치가 없다면 프로그램은 멈추게 된다.
발생한 예외를 핸들링하려면 try ~ catch블록을 코드내에 적절하게 사용해야 한다.
finally블록
익셉션이 발생하든 말든 무조건 실행되는 블록이다.
finally블록은 예외상황을 다루는 코드에서 없어도 되는 선택요소이다.
예외 매커니즘
아래와 같이 메소드1에서 메소드2를 호출, 메소드2에서 메소드3를 호출한다고 가정한다.

만약 메소드3에서 익셉션이 발생했고 메소드3에서 발생한 익셉션을 다루는 try ~ catch 문이 있다면 프로그램은 멈추지 않고 계속
진행된다.
메소드3에서 해당 익셉션을 핸들링하는 try ~ catch 문이 없다면 발생한 익셉션은 메소드3를 호출한 메소드2에 전달된다.
메소드2에서 try ~ catch 문으로 해당 익셉션을 다루는 코드가 없다면 메소드2를 호출한 메소드1으로 익셉션이 전달된다.
만약 발생된 익셉션 객체가 JVM까지 도달될때까지 아무런 조치도 취하지 않는다면, 프로그램은 비정상적으로 종료된다.
익셉션 클래스 계층 구조
자주 반생하는 익셉션
| 발생하는 익셉션 | 예 |
|---|---|
| ArithmeticException | int a = 12/0; |
| NullPointerException | Date d = null; System.out.println(d.toString()); |
| NegativeArraySizeException | arr[-1]; |
| ArrayIndexOutOfBoundException |
int[] arr; arr = new int[2]; arr[2] = 1; |
메소드 선언부에 throws 익셉션클래스 가 쓰인 경우
이 메소드는 해당 익셉션이 발생할 수 있으니 적절하게 익셉션을 처리해야 한다.
적절히 익셉션을 처리하는 하는 방법은 다음과 같다.
첫번째로, 이 메소드를 호출하는 메소드는 메소드 선언부에 throws 익셉션클래스 를 사용하여
전달받은 익셉션을 다시 자신을 호출한 메소드에 전달하도록 처리하는 것이다.
두번째는, 전달받은 익셉션을 자신의 메소드 몸체에서 try ~ catch 구문을 사용하여 직접 처리하는 것이다.
첫번째와 두번째 방법 그 어느것도 사용하지 않는다면 컴파일 에러가 만나게 된다.
여기에도 예외가 있는데, throws 익셉션클래스에서 익셉션클래스가 RuntimeException의 서브 클래스인 경우는
익셉션을 처리하지 않아도 컴파일 에러가 발생하지 않는다.
사용자 정의 익셉션
익셉션이 발생할 상황이 되면 JVM이 자바 API의 익셉션 클래스로부터 익셉션 객체를 생성하고 던진다고 했다.
그런데 이런 익셉션 클래스를 프로그래머가 필요에 따라 만들 수 있다.
이를 "사용자 정의 익셉션" 이라고 부른다.
아래 예는 사용자 정의 익셉션 구현 방법이다.
public class UserServerException extends Exception {
public UserServerException(String name) {
super(name);
}
}
사용자 정의 익셉션은 일반적인 익셉션(자바 API에 있는)과 달리 명시적으로 발생시켜야 한다.
사용자 정의 익셉션으로 부터 익셉션 객체를 만들어 던지는 방법은 다음과 같다.
throw new UserServerException("유효하지 않는 ID입니다.");
참고 문서
http://java.sun.com/docs/books/tutorial/essential/exceptions/definition.html
- 이전 : 컬렉션
