MatchException — 패턴 매칭이 예상치 못하게 실패했을 때

MatchException — 패턴 매칭이 예상치 못하게 실패했을 때

MatchException패턴 매칭(pattern matching)에서 예상치 못한 실패가 발생했을 때 던져지는 예외예요.

출처: Java API Reference

본문

자바 21에서 소개된 이 예외는, 컴파일 타임에 철저한(exhaustive) 패턴 매칭이라 판정된 언어 구조(예: switch 표현식)가 런타임에서 어떤 값에 대응하는 패턴을 못 찾을 때 던져져요. "컴파일러는 모든 경우를 다룬다고 봤는데 실제 값이 어긋났다"는 상황인데, 다음과 같은 경우가 있어요.

  • 분리 컴파일(separate compilation) 이상: 패턴이 참조하는 타입 계층이 달라졌는데 패턴 매칭 구조는 다시 컴파일되지 않은 경우 (예: sealed 인터페이스의 허용 하위 타입 목록이 런타임에 달라졌거나, enum 상수 집합이 달라진 경우)
  • sealed 클래스와 중첩 패턴에서의 null 값: 예를 들어 R(A a)R(B b)를 합치면 타입 R에 대해 철저하다고 보지만, new R(null)에는 어느 패턴도 매칭되지 않아요
  • 중첩 record 패턴과 null 값: 위와 비슷하게, record 컴포넌트 자리에 null이 들어가면 철저한 것으로 판정된 패턴이 매칭되지 않을 수 있어요

또한 값을 패턴에 매칭하는 과정 자체에서도 던져질 수 있어요. record 패턴 같은 경우 컴포넌트 값을 꺼내기 위해 접근자(accessor) 메서드가 암묵적으로 호출되는데, 그 접근자가 예외를 던지면 패턴 매칭이 중단되면서 MatchException을 던져요. 이때 원래 예외는 MatchException의 원인(cause)으로 설정되고, 억제 예외(suppressed exception)는 기록되지 않아요.

상속 구조는 다음과 같아요.

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        java.lang.MatchException

final 클래스라서 더 확장할 수 없어요.

생성자

  • MatchException(String message, Throwable cause) — 상세 메시지와 원인을 함께 지정해요.

더 알아보기 (Learn more)