Error와 Exception
: Java에서는 컴파일 오류, 런타임 오류 두 종류가 있고, 컴파일 오류는 미리 잡아내기 쉽지만 런타임 오류는 해결하기 까다로움
런타임 오류는 Error와 Exception 이 있음
Exception, Error의 계층구조

- Throwable
- getMessage(), printStackTrace()와 같은 메서드가 구현되어 있음
- Exception, Error에 대한 Message를 기록
- Chain 된 예외들의 정보를 기록
- Error
- 코드로 복구되지 않는 오류
- 개발자가 직접 Error를 catch하면 안되며 해결할 수 없음
Ex) OOM(OutOfMemory Error) - 실행중 메모리 부족
- 개발자가 직접 Error를 catch하면 안되며 해결할 수 없음
- 코드로 복구되지 않는 오류
- Exception
- 개발자가 직접 처리할 수 있는 오류
ex) NPE(NullPointerException), IllegalArgumentException - Compile Exception
- Checked Exception이며, 컴파일러가 확인함
- Runtime Exception
- Unchecked Exception이며, 컴파일 후 실행단계(Runtime)에서 발생하는 Exception
- 개발자가 직접 처리할 수 있는 오류
- Exception 상속관계
- 상속 개념은 Exception에도 적용됨
- catch를 통해 예외를 잡으면 하위 Exception들도 모두 catch 함
- Throwable Class를 Exception catch 하면 안된다. Error Class도 모두 catch되기 때문
- 즉, Exception 하위 클래스만 예외 처리를 하면 됨
예외 처리를 하는 법
- try - catch, finally, throws, throw
catch
- 예외가 발생하면 처리한다
- Exception 상속관계에 의해, 하위 Exception이 모두 catch 된다.
- 따라서 Exception을 catch 하는건 지양해야 한다
- 어떤 Exception이 발생했는지 모르기 때문
- 모든 Exception이 해당 catch로 처리되기 때문
- 따라서 Exception을 catch 하는건 지양해야 한다
finally
- 예외발생 여부를 떠나서 최종적으로 실행될 코드
try {
// 예외가 발생할 코드
} catch (Exception) {
// 예외 발생하면 처리하는 코드
} finally {
// 예외를 발생하던, 안하던 최종적으로 실행될 코드
}
throw
- 예외를 발생시키는 코드
- 예외 또한 객체이기 때문에 new 키워드를 사용하여 사용할 수 있다
// 1.
throw new RuntimeException();
// 2.
try {
// 실행할 코드
} catch (Exception e) {
throw new TestCheckedException("내가 만든 메세지");
}
throws
- 예외가 발생하면 던진다
- Exception 상속관계에 의해, 하위 Exception이 모두 throw 된다.
- Java의 main 메서드를 넘어서 throw 하게되면 로그를 출력하며 종료된다.
- 즉, 그 이전에 꼭 catch 해서 처리해야 한다.
Checked Exception, Unchecked Exception
Checked Exception
- Exception class를 상속받으면 checked Exception이 된다.
- Compiler가 체크한다
- Checked Exception은 발생한 예외를 개발자가 명시적으로 처리해야 한다
- catch 혹은 throws로 처리한다
- throws 했다면 이후에 꼭 catch 해야한다.
- 만약, 처리하지 않으면 Compile 오류가 발생한다.
- 예외는 개발자가 미리 알고 대처가 가능한 예외가 좋으나, checked 예외는 꼭 처리(catch, throws)가 필요하기 때문에 번거로운 부분이 있음
Uncheked Exception
- RuntimeException과 하위 Exception
- 말그대로 Compiler가 체크하지 않는다
- Unchecked Exception은 발생한 예외를 개발자가 명시적으로 처리하지 않아도 된다.
- throws를 생략할 수 있다. Checked Exception은 꼭 처리해야됨
- throws를 명시하여도 Compile 시 checked 되진 않는다
- 다른 개발자가 인지할 수 있도록 명시하는 것도 좋은 방법. 기본은 생략
- 코드 컨벤션 중 하나
- 개발자가 실수로 예외 처리를 까먹을 수 있음. Compiler가 check 하지 않기 때문
정리
- CheckedException
- "Exception"을 상속받은 Exception
- 컴파일러가 체크한다
- throws, catch를 생략할 수 없다
- 반드시 예외 처리를 해야함
- UncheckdedException
- "RuntimeException"을 상속받은 Exception
- 컴파일러가 체ㅡ하지 않는다
- throws, catch 를 생략할 수 있다
- 예외 처리를 까먹을 수 있다
- 리스트
'JAVA' 카테고리의 다른 글
| [JAVA] 다형성 파헤쳐보기 (0) | 2025.10.15 |
|---|---|
| [JAVA] 불변객체(Immutable Object) (0) | 2025.10.13 |
| [JAVA Algorithm] 컬렉션 프레임워크 (0) | 2025.10.02 |
| [Java Algorithm] 2차원 배열 (0) | 2025.10.02 |
| [JAVA Algorithm] 배열 개념 정리 (0) | 2025.10.01 |