나의 호기심

Java에서 Exception 뜯어보기

chaeyoung- 2023. 8. 4. 16:21

Exception에 대해서 자세히 살펴보겠습니다.

 

Exception 

 

아래 사진을 보면 Throwable 클래스를 상속한 Exception 과 Error 클래스가 있습니다.

 
 
 
 
 
아래는 Exception 을 상속한 RuntimeException 입니다.

 

여기서 쓰인 주석

@jls 11.2 Compile-Time Checking of Exceptions 

RuntimeException 클래스가 자바 언어 명세(JLS)의 11.2 섹션인 "Compile-Time Checking of Exceptions"과 관련이 있다는 의미입니다. 즉, 해당 클래스가 예외 처리에 관련된 규칙과 관련된 부분을 구현하거나 설명한다는 것을 나타냅니다.

 

 

 

 

 

JLS는 JDK 버전과 1:1 매칭이 되므로 해당 build.gradle 혹은 pom.xml 에서 JDK 버전을 확인하여 찾아보겠습니다.

sourceCompatibility = '17'

 

제 프로젝트 환경에 맞는 JLS 17 버전 문서를 살펴보겠습니다.

Java 프로그래밍 언어에서 예외 처리에 대한 규칙과 원칙에 대한 설명입니다.

 


  1. Checked Exception과 Unchecked Exception:
    • Checked Exception은 컴파일 시점에 반드시 예외 처리를 해야 하는 예외를 의미합니다. 이러한 예외들은 throws 구문을 통해 해당 메서드에서 처리되거나, try-catch 블록을 사용하여 예외를 잡아서 처리해야 합니다.
    • Unchecked Exception은 컴파일 시점에 체크되지 않으며, 프로그램 실행 중에 발생할 수 있는 예외입니다. 이러한 예외들은 컴파일러가 예외 처리를 강제하지 않으며, RuntimeException 클래스와 그 하위 클래스들이 여기에 해당됩니다.
  2. Checked Exception과 Override:
    • 메서드를 오버라이드할 때, 오버라이드하는 메서드는 기본적으로 오버라이드되는 메서드에서 선언된 Checked Exception들을 던질 수 있어야 합니다.
  3. Error와 Run-time Exception:
    • Error 클래스와 그 하위 클래스들은 컴파일 시점 예외 검사에서 제외됩니다. 이는 프로그램에서 잘 처리할 수 없는 치명적인 오류들을 포함합니다.
    • Run-time Exception 클래스들 또한 컴파일 시점 예외 검사에서 제외됩니다. 이는 프로그램 실행 중에 발생할 수 있는 일반적인 오류들을 의미합니다.
  4. Java 컴파일러와 예외 처리:
    • Java 컴파일러는 프로그램의 정확성을 검증하기 위해 런타임 예외를 포함한 많은 예외 상황을 정적으로 검사하지 않습니다. 이러한 예외들은 프로그래머가 신중하게 처리해야 합니다.
  5. Catch 구문과 예외 클래스:
    • catch 구문은 해당하는 예외 클래스들을 잡을 수 있습니다. 단일 catch 구문은 예외 파라미터의 선언된 타입과 일치하는 예외를 잡습니다. 다중 catch 구문은 예외 파라미터의 타입을 통해 잡을 수 있는 예외의 유니온(합집합)을 의미합니다.

공식 문서 링크는 아래에 걸어두겠습니다.

 


하여 RuntimeException은 컴파일 단계에서 체크되지 않고, 프로그램 실행 중에 발생하는 예외입니다.

Unchecked Exception의 최상위 클래스 입니다.

 

 

그렇기 때문에, RuntimeException을 상속받는 Exception 클래스는 모두 Unchecked Exception이며,

반대로 이를 상속받지 않은 Exception은 모두 Checked Exception 입니다.

 

또한, Error도 Unchecked Exception에 해당됩니다. 

 

 

 


RuntimeException 를 상속받는 예외는 Unchecked Exception, 반대는 Checked Exception