프로그램은 어떤 원인에 의해 오작동 또는 비정상적 종료가 일어나는 경우가 있다.
이러한 결과를 초래하는 원인을 오류 또는 에러라고하며 발생 시점에 따라 3가지로 나뉜다.
컴파일러는 소스코드(.java)의 오타, 잘못된 구문, 자료형 체크 등 기본적인 검사를 수행하여 오류가 있는지 알려주는데, 이 때 발생하는 것이 컴파일 에러다.
그리고 이 컴파일 과정이 끝나면 클래스파일(.class)이 생성되고, 생성된 클래스 파일을 실행할 수 있게 된다. 하지만 컴파일에는 문제가 없더라도, 프로그램 실행 중에 에러가 발생해서 잘못된 결과를 얻거나, 혹은 외부적인 요인으로 프로그램이 비정상적으로 종료될 수 있다. 이 때 발생하는 것이 실행 오류(런타임 에러)이다.

자바에서는 실행 시 발생할 수 있는 오류(Runtime Error)를 Exception과 Error 클래스로 정의해놓았다.
Exception 클래스는 Checked Exception와 Unchecked Exception로 나눌 수 있다.
FileNotFoundException), 클래스 이름을 잘못 입력(ClassNotFoundException) ...NullPointException), 배열의 범위를 벗어난 동작(ArrayIndexOutOfBoundException) 등| 구분 | Checked Exception | Unchecked Exception |
|---|---|---|
| 확인 시점 | 컴파일 시점 | 런타임 시점 |
| 처리 여부 | 반드시 예외처리를 해주어야 함 (try-catch 또는 throws) | 명시적으로 하지 않아도 됨 |
| 트랜잭션 처리 (Spring 기본) | 예외 발생 시 Rollback 하지 않음 | 예외 발생 시 Rollback 함 |
| 대표 종류 | IOException, SQLException, ParseException 등 | NullPointerException, IndexOutOfBoundsException, IllegalArgumentException 등 |
예외 처리란, 프로그램 실행 시 예외 발생에 대비한 코드를 작성하는 것이다.
try {
// 예외가 발생할 가능성이 있는 코드
} catch(Exception1 e1) {
// 예외1이 발생했을 경우, 처리하기 위한 코드
} catch(Exception2 e1) {
// 예외2이 발생했을 경우, 처리하기 위한 코드
} catch(Exception3 e1) {
// 예외3이 발생했을 경우, 처리하기 위한 코드
} finally {
// 예외 발생여부에 관계없이 항상 수행되어야하는 문장을 넣는다. (선택 사항)
}
try-catch-finally 문을 사용하여 예외상황을 파악하고 정상상태로 되돌려 놓는 방법을 뜻한다.void method() throws Exception1, Exception2, Exception3 {
...
}
//1.여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다룸
catch(SpaceException e){
InstallException ie = new InstallException("설치 중 예외발생");
ie.initCause(e);
throw ie;
}
//2.checked exception을 unchecked exception으로 바꿈
throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
Checked Exception은 컴파일 시점에 강제로 처리해야 하는 복구 가능한 예외이고, Unchecked Exception은 런타임에 발생하는 프로그래밍 오류 성격의 예외로 강제되지 않습니다. Spring에서는 Checked는 기본적으로 롤백하지 않고, Unchecked는 롤백합니다.
예외처리의 방법으로는 예외 복구(try-catch), 예외 처리 회피(throws), 예외 전환(throw new)이 있습니다.