예외의 종류와 특징
예외 처리에서 가장 큰 이슈는 체크 예외(checked exception)
라고 불리는 명시적인 처리가 필요한 예외를 사용하고 다루는 방법이다.
Error
java.lang.Error
클래스의 서브 클래스들이 있다. 시스템에 비정상적인 상황이 발생했을 경우 사용되며, 자바 VM에서 발생시키는 것이므로 애플리케이션 코드에서 잡으려고 하면 안된다. OutOfMemoryError
나 ThreadDeath
같은 에러는 catch
블록으로 잡아봤자 아무런 대응 방법이 없다.
시스템 레벨에서 이뤄지는 에러기 때문에 애플리케이션에서는 이런 에러에 대한 처리를 신경쓸 필요가 없다.
Exception과 체크 예외
java.lang.Exception
클래스와 그 서브 클래스로 정의되는 예외들은 에러와 달리 개발자들이 만든 애플리케이션 코드의 작업 중에 예외 상황이 발생한 경우에 사용된다.
Exception
클래스는 체크 예외(checked exception)
와 언체크 예외(unchecked exception)
로 구분된다.
체크 예외
는Exception
클래스의 서브 클래스이면서,RuntimeException
클래스를 상속하지 않은 것들을 말한다.체크 예외
는 IDE에서 예외처리를 강요한다.
언체크 예외
는RuntimeException
을 상속한 클래스들을 말한다.언체크 예외
는 IDE에서 예외처리를 강요하지 않는다.
자바는 RuntimeException
클래스와 RuntimeException
을 상속한 클래스들을 특별하게 다룬다.
일반적 예외는 RuntimeException
을 상속하지 않은 예외를 말한다고 볼 수 있다. JDK 초기 설계자들은 체크 예외를 발생 가능한 모든 예외에 적용하려고 노력했던 것 같으나, 현재의 트렌드는 조금 다르다.
RuntimeException과 언체크/런타임 예외
java.lang.RuntimeException
클래스를 상속한 예외들은 명시적인 예외처리를 강제하지 않기 때문에 언체크 예외
라고 불린다. 또는 런타임 예외
라고도 한다.
주로 프로그램의 오류가 있을 때 발생하도록 의도된 것들이다. 할당되지 않은 객체 변수를 사용하려 할 때 나타나는 NullPointerException
이나 허용되지 않은 인자를 주어 메소드를 호출할 때 발생하는 IllegalArgumentException
등이 있다. 이런 예외는 피할 수 있지만, 개발자가 부주의해서 발생할 수 있는 경우에 발생하도록 만든 것이다.
처음 JDK 설계자들은 체크 예외의 예외처리를 강제하는 설계를 했지만, 이전에 보았듯, 예외 블랙홀
이나 무책임한 throws
와 같은 코드가 남발되었다.
최근 새로 등장하는 자바 표준 스펙의 API들은 가능한 체크 예외를 만들지 않는 경향이 있기도 하다.
'Java > 자바 잡지식' 카테고리의 다른 글
자바 레코드 (Record) 란 무엇일까? (0) | 2023.12.01 |
---|---|
자바 리플렉션 (Reflection) 이란? (0) | 2023.06.26 |
자바의 ThreadLocal 이란? (0) | 2023.06.23 |
자바 Stream 에 size() 혹은 length 프로퍼티가 없는 이유 (0) | 2023.03.31 |
자바 함수형 인터페이스 혹은 람다 인터페이스란? (0) | 2023.03.29 |