시스템에 비정상적인 상황이 생겼을 때 발생합니다. 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류입니다. 따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 됩니다.
개발자가 구현한 로직에서 발생합니다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있습니다. 따라서 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요합니다.
모든 예외 클래스는 Throwable 클래스를 상속받고 있으며, Throwable은 최상위 클래스 Object의 자식 클래스입니다.
Throwable을 상속받는 클래스는 Error와 Exception이 있습니다. Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 하는 경우가 일반적입니다. 반면에 Exception은 개발자가 로직을 추가하여 처리할 수 있습니다.
Exception은 수많은 자식클래스를 가지고 있습니다. 그 중 RuntimeException을 주목해야 합니다. RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준입니다. Exception의 자식 클래스 중 RuntimeException을 제외한 모든 클래스는 CheckedException이며, RuntimeException과 그의 자식 클래스들을 Unchecked Exception입니다.
UnCheckedException | CheckedException | |
---|---|---|
클래스 | RuntimeException 클래스와 자손 클래스 | Exception 클래스 자손 중 RuntimeException 제외한 모든 클래스 |
확인 시점 | 실행 단계 | 컴파일 단계 |
강제 처리여부 | 처리를 강제하지 않음 | 반드시 예외처리를 해야 함 |
예외 발생시 트랜잭션 처리 | rollback 함 | rollback 하지 않음 |
대표예외 | - NullPointException - IllegalArgumentException | - IOException - SQLException |
장점
단점
예외 복구
public void exception(){
final int MAX_COUNT = 5;
int tryCount = MAC_COUNT;
while(tryCount < MAX_COUNT){
try {
return;
}catch(Exception e){
}finally{
}
}
throw new RuntimeException();
}
책임 회피
public void responsibility() throws FileNotFoundException {
BufferedReader br = new BufferedReader(new FileReader(""));
}
예외 전환
public void exception(){
if(/*이메일이 이미 존재*/){
throw new exception();
}
}
참고 자료