예외 처리
오류란 무엇인가?
- 컴파일 오류: 프로그램 코드 작성 중 발생하는 문법적 오류
- 실행 오류: 실행 중인 프로그램이 의도하지 않은 동작을 하거나(bug) 프로그램이 중지 되는 오류(runtime error)
- 자바는 예외 처리를 통하여 프로그램의 비정상 종료를 막고 log를 남길 수 있음
오류와 예외 클래스
- 시스템 오류 (error): 가상 머신에서 발생, 프로그래머가 처리 할 수 없음, 동적 메모리를 다 사용한 경우, stack over flow 등
- 예외 (Exception): 프로그램에서 제어 할 수 있는 오류, 읽으려는 파일이 없는 경우, 네트웍이나 소켓 연결 오류 등

예외 클래스
- 모든 예외 클래스의 최상위 클래스는 Exception 클래스이다.

try - catch 문으로 예외 처리하기
try {
예외가 발생 할수 있는 코드 부분
} catch ( 처리할 예외 타입 e ) {
try 블록 안에서 예외가 발생했을 때 수행되는 부분
}
try - catch - finally 문으로 예외 처리하기
try {
예외가 발생 할수 있는 코드 부분
} catch ( 처리할 예외 타입 e ) {
try 블록 안에서 예외가 발생했을 때 수행되는 부분
} finally {
예외 발생 여부와 상관 없이 항상 수행 되는 부분
리소스를 정리하는 코드를 주로 씀
}
try - with - resources 문
- 리소스를 자동으로 해제 하도록 제공해주는 구문
- 해당 리소스가 AutoCloseable을 구현한 경우 close()를 명시적으로 호출하지 않아도 try {} 블록에서 오픈된 리소스는 정상적인 경우나 예외가 발생한 경우 모두 자동으로 close()가 호출 됨
- 자바 7 부터 제공 됨
- FileInputStream 의 경우 AutoCloseable을 구현 하고 있음
예외 처리 미루기
- throws를 사용하여 예외처리 미루기
- try{} 블록으로 예외를 처리 하지 않고, 메서드 선언부에 throws를 추가
- 예외가 발생한 메서드에서 예외 처리를 하지 않고 이 메서드를 호출한 곳에서 예외 처리를 한다는 의미
- main()에서 throws를 사용하면 가상머신에서 처리됨
다중 예외 처리하기
- 하나의 try{} 블록에서 여러 예외가 발생하는 경우 catch{} 블록 한곳에서 처리하거나 여러 catch{} 블록으로 나누어 처리 할 수 있음
- 가장 최상위 클래스인 Exception 클래스는 가장 마지막 블록에 위치 해야 함
public static void main(String[] args) {
ThrowsException test = new ThrowsException();
try {
test.loadClass("a.txt", "java.lang.String");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
사용자 정의 예외
- JDK 에서 제공되는 예외 클래스 외에 사용자가 필요에 의해 예외 클래스를 정의하여 사용
- 기존 JDK 클래스에서 상속받아 예외 클래스 만듬
public class IDFormatException extends Exception {
public IDFormatException(String message) {
super(message);
}
}