Java 예외 처리 - 예외 계층

자바는 예외(Exception)라는 예상치 못한 상황을 처리하기 위한 매커니즘이 있다.
프로그램 안정성과 신뢰성을 높이는 역할을 담당한다.

자바 예외 처리 키워드는 다음과 같이 사용한다.

예외 키워드

  • try
  • catch
  • finally
  • throw
  • throws

그 밖에 예외 처리용 객체들이 있다.

예외 계층 - Throwable

      +-----------+
      | Object    |
      +-----+-----+
            |
      +-----+-----+
      | Throwable |
      +---+---+---+
          |   |
      +---+   +----+
      |            |
+-----+-----+  +---+---+
| Exception |  | Error |
+-----------+  +-------+
  • Object
    • 자바에서 기본형을 제외한 모든 객체는 Object 상속 받고 있다. 예외도 객체이므로 Object 가 최상위 부모이다.
  • Throwable
    • 최상위 예외. 하위에는 Exception 과 Error 과 있다.

예외 계층 - Throwable - Error

+-------+
| Error |
+---+---+
    |
+---+--------------+
| OutofMemoryError |
+------------------+
  • Error
    • 메모리 부족과 같은 심각한 시스템 오류. 애플리케이션 레벨에서 복구가 불가능한 시스템 예외이다.
    • 애플리케이션 개발자는 이 예외를 잡아서 할 수 있는 것이 없다.

예외 계층 - Throwable - Exception

                  +-----------+
                  | Exception |
                  +-----+-----+
                        |
       +----------------+-----------------+
       |                |                 |
+------+-------+ +------+------+ +--------+---------+
| SQLException | | IOException | | RuntimeException |
+--------------+ +-------------+ +------------------+
  • Exception
    • 애플리케이션 레벨에서 최상위 예외이다.
    • Exception 과 그 하위 예외 SQLException, IOException는 컴파일러가 담당하는 체크 예외이다.

예외 계층 - Throwable - Exception - RuntimeException

                +------------------+
                | RuntimeException |
                +---+---------+----+
                    |         |
+-------------------+---+ +---+-----------------------+
| NullPointer Exception | | IllegalArgument Exception |
+-----------------------+ +---------------------------+
  • RuntimeException 예외는 언체크 예외로 런타임 예외라고 부른다.
    • 컴파일러가 체크하지 않아 언체크 예외라 한다.
    • RuntimeException 상속 받은 자식 모두 언체크 예외이다.
    • 이름을 따와 언체크 대신 런타임 예외로 편의상 부르고 있다.

체크 예외와 언체크(런타임) 예외

체크 예외는 개발자가 명시적으로 처리해주어야 하는 예외 상황이다. 그렇지 않은 경우 컴파일 오류를 반겨줄 것이다.
언체크 예외는 개발자가 예외를 명시적으로 처리하지 않아도 된다.(명시적으로 체크하더라도 무시하고 동작 될 가능성이 크다.)

예외 계층에서의 주의사항

상속 관계의 자식은 부모 타입을 모두 담고 있다. 이 또한 예외 처리에도 똑같이 적용되어 상위 예외를 catch로 잡으면 그 하위 예외까지 함께 잡히게 된다. 만약 Throwable 예외를 처리한 경우 이 에러가 Error 인지 Exception 예외인지 확인이 필요하다.
만약 Error 예외라면 애플리케이션 개발자가 처리할 수 없는 상황인 것이다.