[Java]Error, Exception(Checked, Unchecked)
🙆♂️ import 🙇♂️
자바 예외 구분: Checked Exception, Unchecked Exception[오늘도 MadPlay!]
Exception, Error
Exception은 정상적인 Program의 flow를 어긋나는 것을 말한다.
입력 값에 대한 처리 불가, Program 실행 중 참조된 값이 잘못된 경우 등
Java에서 Exception은 개발자가 직접 Application Code내에서 처리 할 수 있어, 예외 상황에 대해 미리 예측하여 Handling할 수 있다.
Error는 System에 비정상적인 상황이 발생한 경우를 말한다.
Java에서 주로 JVM(Java Virtual Machine)에서 발생시키는 것이고, Exception과 반대로 Application Code에서 잡아도 처리할 제대로 방법이 없다.
OutOfMemoryError, ThreadDeath, StackOverflowError 등
package src.throwable.error;
public class ErrorExample {
public static void gillog(String log) {
System.out.println(log);
}
public static void main(String[] args) {
try {
gillog("Error Test");
} catch (StackOverflowError e) {
// ......... :(
}
}
}
위 코드 처럼 StackOverflowError에 대해서 Catch를 하려해도 사실 별 소용이 없다.
Checked Exception, Unchecked Exception
Exception과 Error가 Java내에서 상속관계를 살펴보면 아래 그림과 같다.
[출처]자바 예외 구분: Checked Exception, Unchecked Exception[오늘도 MadPlay!]
Exception과 Error는 최상위 Object를 상속받는 Throwable Class를 상속받는 Class 이다.
Checked Exception과 Unchecked Exception에 대해 설명 하기전 알아야 할 사항은 Error와 Runtime Exception이 있다.
결론적으로 먼저 설명하면, Checked Exception은 Error와 RuntimeException을 상속하지 않은 Exception Class를,
Unchekced Exception은 RuntimeException을 상속받는 Exception Class를 의미한다.
즉, RuntimeException을 상속하지 않고 꼭 처리해야 하는 Exception은 Checked Exception이고,
반대로 명시적으로 처리하지 않아도 되는 Exception은 Unchecked Exception이다.
Error
Error는 자식 Class로 LinkageError, ThreadDeath, AssertionError, VirtualMachineError를 가지고 있다.
Error를 상속받는 Class에 대한 설명은 아래와 같다.
| Class | 설명 |
|---|---|
| LinkageError | 어떤 클래스가 다른 클래스에 대한 종속성이 있는 상황에서, 후자 클래스가 이전 클래스를 컴파일 한 후 비호환적으로 변경된 경우 발생하는 Error이다. |
| ThreadDeath | 더 이상 사용되지 않는 Thread에 대해 Thread.stop() method가 호출 될 때, 삭제되는 Thread에서 Instance가 throw 되며 발생하는 Error이다. |
| AssertionError | Assertion이 실패한 경우 발생하는 Error이다.Assertion : 해당 지점에서 개발자가 반드시 참(true)이어야 한다고 생각하는 사항을 표현한 논리식 _[EX] assert [boolean]; assert [boolean] : [표현식]; |
| VirtualMachineError | JVM이 손상되었거나 계속 작동하는 데 필요한 리소스가 부족할때 발생하는 Error |
RuntimeException
RuntimeException은 말 그대로 Program 실행 중에 발생하며 System 환경적으로나, Input Value가 잘못된 경우, 의도적으로 개발자가 설정한 조건을 위배했을 때 throw 되게 하는 등, Application 실행 도중에 발생하는 Exception이다.
RuntimeException은 명시적으로 예외 처리를 하지 않아도 되는 Exception이다.
Exception 처리를 명시하지 않아도 Program 구동에 아무 문제가 없다.
이제 CheckedException과 UncheckedException을 조금 자세히 살펴보자.
CheckedException
CheckedException은 반드시 예외 처리 해야하는 Exception으로, Compile 시점에서 Exception 발생이 확인되는 Exception이다.
CheckedException은 Error와 RuntimeException을 상속하지 않은 Exception들을 모두 포함한다.
Error, FileNotFoundException, ClassNotFoundException 등이 대표적이다.
Spring Framework에서 CheckedException은 Transaction 처리시에 Exception이 발생해도 Rollback을 하지 않는다.
UncheckedException
UncheckedException은 명시적으로 예외 처리 해주지 않아도 되는 Exception으로, Runtime 시점에서 Exception 발생이 확인되는 Exception이다.
UncheckedException은 RuntimeException을 상속받는 Exception들을 포함한다.
NullPointerException, ClassCastException 등
Spring Framework에서 UncheckedException은 Transaction 처리시에 Exception이 발생한 경우 Rollback을 수행한다.
CheckedException과 UncheckedException를 정리한 표는 아래와 같다.
| CheckedException | UncheckedException | |
|---|---|---|
| 확인 시점 | Compile | Runtime |
| 처리 | 반드시 예외 처리 | 명시적으로 하지 않아도 무관 |
| 트랜잭션 처리 시 _ In Spring Framework_ |
예외 발생 시 Rollback 수행 X | 예외 발생 시 Rollback 수행 O |
| 예시 | ClassNotFoundException | NullPointerException |
댓글남기기