코딩을 하다 보면, 정말 수많은 예외와 마주치게 됩니다. 그러나 예외에는 어떤 종류가 있는지, 어떤 상황에서 예외가 발생하는지 자세히 들여다볼 기회가 없었습니다. 이번 포스팅에서는, 자바 예외의 종류와 각각 어떤 Exception이 속해 있는지 알아봅시다.
3가지 예외
자바 예외는 크게 3가지 유형으로 나누어집니다.
- Checked Exception: 명시적으로 처리해야 하는 예외 (IOException, FileNotFoundException 등)
- Unchecked Exception: RuntimeException 상속. 명시적인 예외 처리를 강제하지 않음 (NullPointerException 등)
- Error: 시스템에 비정상적인 상황이 발생한 경우 (StackOverflowError 등)
쉽게 설명하자면, 코딩을 하다가 빨간 줄이 뜨면서 예외 처리를 하지 않으면 실행을 못하는 경우가 Checked Exception, 실행 도중에 발생하는 에러가 Unchecked Exception입니다.
그리고 Error는 둘 과는 다른 조금 특수한 상태의 에러인데, 애플리케이션단에서 복구할 수 없는 상황을 주로 일컫습니다.
Checked Exception
컴파일 시에 발생하는 Checked Exception에는 IOException, ClassNotFoundException, SQLException 등이 속합니다. 그림 2-1의 IOException 자바 예제 코드를 이용하여 조금 더 알아봅시다.
코드를 치기가 무섭게 빨간 줄이 나타납니다. 에러 내용을 보면 IOException 예외 처리를 강제하고 있습니다. 게다가 실행도 되지 않습니다.
실행을 시키기 위해 try-catch 문으로 예외 처리를 추가해보겠습니다.
빨간 줄이 없어지고, 이제는 실행도 할 수 있습니다. 물론 "example.txt" 파일이 존재하지 않기 때문에
"Error reading file: example.txt (지정된 파일을 찾을 수 없습니다)"문이 프린트됩니다만, 실행을 할 수 있다는 것에 의의를 둡시다. 파일을 추가한다면 정상적으로 읽을 수도 있습니다.
Unchecked Exception
RuntimeException 이라고도 알려져 있는 Unchecked Exception은, 런타임에서 발생하고 코드에서 명시적으로 예외 처리를 할 필요가 없습니다. 흔히 보는 NPE(NullPointerException), IndexOutOfBoundsException, ArithmeticException 등이 이에 속합니다.
다음은 NullPointerException을 이용하여 코드에서 예외가 발생하는 예시입니다.
인텔리제이 IDE에서 해당 코드는 NPE의 위험이 있다고 알려주긴 하지만, 실행할 수는 있습니다. 물론, 실행한다면 다음과 같은 오류가 발생합니다.
Unchecked Exception은 프로그램 실행 도중 언제든지 발생할 수 있습니다. Checked Exception과 다르게 명시적으로 예외 처리를 강제하고 있지 않기 때문에, 발생 위험이 있는 경우에도 지나치고 넘어갈 수 있습니다.
Error
Error는 런타임 시에 발생하며, 일반적으로 프로그램의 제어 범위를 벗어난 문제로 인해 발생합니다. 프로그램의 호출 스택이 최대 크기를 초과할 때 발생하는 StackOverflowError를 예시로 들 수 있습니다.
자신을 반복적으로 호출하는 재귀 메서드가 존재하며, 재귀를 중지할 코드가 없으므로 스택이 모두 채워지고 결국엔 StackOverflowError 가 발생하게 됩니다.
Unchecked Exception처럼 IDE 상에서 경고를 날리기는 하지만, 역시 실행은 할 수 있습니다.
이와 같은 오류는 하드웨어 오류 또는 운영 체제와 같은 문제로 인해 발생하며 프로그램의 제어 범위를 벗어납니다. 따라서 예외처럼 처리하거나 포착할 수 없으며 신중한 설계나 테스트를 통해 방지해야 합니다.
참고
'Java & Spring Boot' 카테고리의 다른 글
멀티모듈에서 공통 모듈의 의존성이 포함이 안돼요 (0) | 2024.02.21 |
---|---|
@Getter 어노테이션을 이해해보자 (0) | 2023.08.07 |
자주 쓰이는 디자인 패턴을 알아보자(with Java) (0) | 2023.03.19 |
스프링 빈 중복 에러 해결하기 (0) | 2023.03.07 |
자원을 반납하자 (부제: try-catch-finally 멈춰!) (0) | 2023.02.26 |