Java Section 14 : 예외처리
■ 예외(exception)
: 프로그램 구동 중 나타나는 오류들. 문법적으로는 문제없어 보이지만 실제 운영 중에 생기는 문제를 나타냄
* 에러(error) 와 다르다! 에러는 개발자가 예측하거나 처리할 수 없는 영역이다.
구분 | 체크 예외 | 비체크 예외 |
처리 여부 | 문법적으로 예외 처리를 강제함 반드시 처리해야 함 |
문법적으로 강제하지 않음 개발자의 판단에 의해 처리 |
확인 시점 | 컴파일 단계 | 실행 단계 |
예외 클래스 | Runtime Exception을 제외한 모든 예외 IOException SQLException 등 |
Runtime Exception의 자식 클래스 모두 포함 NullPointerException IndexOutOfBoundException ClssNotFoundException 등 |
예외클래스
[자주 사용되는 예외]
① NullPointerException : 자바에서 가장 빈번하게 발생하는 실행 예외
- 객체가 제대로 생성되지 않은 상태에서 사용할 경우 발생 (실제 메모리에 생성되지 않은 경우)
② NumberFormatException : 잘못된 문자열을 숫자로 형 변환 할 때 발생
③ ArrayIndexOutOfBoundException : 배열에서 인덱스 범위를 초과해 사용할 때 발생
예외처리 문법
- JVM이 예외를 발생 지점으로 던지는데, 이를 처리해야 프로그램이 비정상적으로 종료되지 않는다.
■ 기본 예외처리 문법 : "try-catch"
try {
// 예외가 발생할 가능성이 있는 코드
}
catch(예외클래스명 e) {
// 예외 처리 코드
} finally {
// 무조건 실행되는 코드
}
□ 예외를 처리할 때 Exception 클래스를 이용하면 모든 예외를 처리할 수 있지만, Exception을 가장 하단에 둘 것. 그렇지 않으면 문법 에러가 발생한다.
■ 다중 catch문 : 예외별로 예외 처리 코드를 다르게 하여 다양한 예외 처리 진행
-> 예외를 다중처리함으로써 안정적인 프로그래밍 가능!
try {
fr= new FileReader(path+fileName); // 파일 읽어들이기
BufferedReader br = new BufferedReader(fr);
while(true) {
msg = br.readLine();
if(msg == null) {
break;
}
System.out.println(msg);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
예시.
■ finally : 예외 발생 유무와 상관없이 실행되며 생략할 수 있다. 보통 외부 연동이나 예외가 발생해도 정상 종료되어야 할 구문들에서 사용한다.
■ 예외 던지기 : 메서드 내부에서 예외를 처리하지 않고 미룬 후, 해당 메서드를 호출한 쪽에서 예외를 처리하도록 함
- "throws" 키워드 사용.
- 예외 객체는 여러 개 던질 수 있으며, 여러 개 던질 시 콤마(,)로 구분해서 나열한다.
□ 프로그램의 규칙에 위배되어 예외를 발생해야 할 경우, 임의로 예외 발생 가능
: throw new 예외 객체(메세지);
사용자 정의 예외 처리
□ 자바가 제공하는 예외 객체 외에도 개발자의 목적에 의해 예외 객체 생성 가능
- 사용자가 만든 클래스에 Exception 또는 RuntimeException을 상속하면 해당 클래스를 예외 처리 객체로 사용할 수 있다.
- 체크 예외는 Exception, 비체크 예외는 RuntimeException