Checked Exception 종류 - Checked Exception jonglyu

Checked Exception과 Uncecked Exception 정리

Checked Exception과 Uncecked Exception 정리

1. 예외란? (Error vs Exception)

먼저 오류(Error)와 예외(Exception)의 개념을 정리하자.

오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다. 따라서 개발자가 미리 에측하여 처리할 수 없기 때문에, 어플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.

오류가 시스템 레벨에서 발생한다면, 예외(Exception)는 개발자가 구현한 로직에서 발생한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다. 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리방법을 명확히 알고 적용하는 것이 중요하다.

Exception Class 계층도

2. Checked Eception과 Unchecked Exception

 Checked ExceptionUnchecked Exception
처리여부 반드시 예외를 처리해야함 명시적인 처리를 강제하지 않음
확인 시점 컴파일단계 실행단계
예외발생시 트랜잭션처리 roll-back하지않음 roll-back함
대표 예외 Exeption의 상속받는 하위클래스 중 Runtime Exception을 제외한 모든 예외(대표적으로 IOException) RuntimeException 하위 예외 (대표적으로 NullPointerException)

좀더 자세히 보자!

Unchecked Exception

  • Code를 잘못 만들어서 생기는 예외
  • 컴파일하는데는 문제없다. 실행하면 문제가 발생함

배열의 범위를 벗어난다던가(IndexOutOfBoundsException) 값이 null인 참조변수의 멤버를 호출하려 했다던가(NullPointerException) 클래스간의 형변환을 잘못했다던가(ClassCastException) 정수를 0으로 나누려 했다던가(ArithmeticException)하는 경우에 발생하는 예외들이다.

RuntimeException클래스들 중의 하나인 ArithmeticException을 try-catch문으로 처리하는 경우도 있지만, 사실 try-catch문을 사용하기보다는 0으로 나누지 않도록 프로그램을 변경하는 것이 올바른 처리방법이다. 이처럼 RuntimeException예외들이 발생할 가능성이 있는 코드들은 try-catch문을 사용하기 보다는 프로그래머들이 보다 주의 깊게 작성하여 예외가 발생하지 않도록 해야 할 것이다.

그 외의 Exception클래스들은 주로 외부의 영향으로 발생할 수 있는 것들로서, 프로그램의 사용자들의 동작에 의해서 발생하는 경우가 많다. 예를 들면, 존재하지 않는 파일을 처리하려한다던지(FileNotFoundException), 실수로 클래스의 이름을 잘못 적었다던가(ClassNotFoundException), 입력한 데이터의 형식이 잘못되었다던가(DataFormatException) 하는 경우에 발생하는 예외들이다. 이런 종류의 예외들은 반드시 처리를 해주어야 한다.

Checked Exception

  • Exception 처리코드를 compiler가 check
  • 프로그램 실행 흐름상 예외발생 가능성 있는 상황을 표현
  • Code상의 문제가 아니라, 실행상황에 따라 발생가능성 있는 예외
  • 프로그램 구현 흐름상 발생할 수 있는 예외

3. 예외 처리

  • try catch finally - 직접처리
    • 다음메소드에 던져줄 때, 명시해줘야한다.
  • throws - 간접처리
    • 이걸 명시해주지않으면, 예외가 있는지 없는지 모르니까 명시해 준다.
  • throw - 예외생성
    • Checked Exception에서 던져주는것 상위 메소드에다가 예외를 만들어서.

권장사항

  • 왠만하면 Catch구문 안에는 Logic를 넣지 않는다. (보통 log만찍는다.)
  • Catch구문은 많이 쓸수 있다. (권장)Catch계층구조가 높을수록 아래로 내려야 한다. - 자식이 처리할수 있는 건 자식이 하고 자식이 처리하지 못하는 것은 아래에 둔다.(부모가 처리)
  • 순서가 바뀌면 UnReachableException이 발생한다.

Better Understanding on Checked Vs. Unchecked Exceptions - How to Handle Exception Better Way in Java? • Crunchify

Checked Exception What is Checked Exception in Java Programming language. In simple language: Exception which are checked at Compile time called Checked

crunchify.com

개발을 하다 보면 예외를 처리해야 하는 상황이 아주 많이 발생한다. 이때 예외에 대해서 정확히 알고 있어야 좋은 코드를 짤 수 있기에 예외에 대한 포스팅을 한다.

에러(Error) vs 예외(Exception)

우선 자바에서 예외는 크게 Error와 Exception으로 나뉜다.

Error란 시스템 레벨에서 발생하는 심각한 수준의 오류를 뜻하며 개발자가 미리 예측하여 처리할 수 없기에 개발 시 예외 처리에 신경 쓰지 않아도 되는 부분이다. 

Exception이란 로직 상에서 발생하는 오류로 개발자 구현한 코드에서 발생하여 예외를 예측할 수 있으며 상황에 맞게 처리할 수 있다.

예외 클래스 구조

이러한 예외 클래스들은 최상위 클래스인 Object를 상속받은 Throwable이라는 클래스를 기반으로 Error와 Exception 클래스로 나뉘며 이때 Exception 클래스는 RuntimeException 상속 여부에 따라 Checked Exception과 Unchecked Exception으로 나뉜다.

그래서 예외라고 하면 크게 Error , Checked Exception, Unchecked Exception을 생각하면 된다.

Checked Exception VS Unchecked Exception

RuntimeException의 상속 여부에 따라 Checked Exception과 Unchecked Exception이 나뉘는데 여러 가지 방면에서 차이가 난다.

아래의 표는 Checked Exception과 Unchecked Exception의 차이를 간략하게 표로 정리한 부분이다.

  Checked Exception Unchecked Exception
애플리케이션에서
예외 처리 여부
반드시 예외 처리 코드가 있어야 한다. 강제가 아니다.
예외의 확인 서점 컴파일 단계에서부터 컴파일이 되지 않는다. 런타임중 예외가 확인된다.
대표적인 클래스 Exception을 상속 받는 클래스중 RuntimeException을 제외한 모든 예외 클래스
IOException
SQLException
RuntimeException을 상속받는 모든 클래스
NullPointerException
IndexOutOfBoundException

예외 처리 방법

Exception을 처리하는 방법은 여러 가지가 있다. 

첫 번째로 예외 복구이다.

예외 복구란 예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법 (try - catch - finally) 으로 아래와 같은 코드로 예외를 처리한다.

public static void main(String[] args) throws IOException { byte[] list = {'a', 'b', 'c'}; try { System.out.write(list); } catch (IOException e) { // 여기서 뭔가를 처리하는 로직을 넣어준다. } }

이 예외 복구 방법은 대부분의 상황에서 예외를 복구할 수 없기에 실무에서는 보통 잘 사용할 일이 없다.

두 번째로는 예외 처리 회피이다.

예외 처리 회피란 예외 처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버리는 방법 ( throws )으로 아래와 같은 코드로 예외를 던져버린다.

public static void main(String[] args) throws IOException { byte[] list = {'a', 'b', 'c'}; System.out.write(list[4]); }

예외 처리 회피의 방법은 적당한 상황에서 사용하면 퀄리티 좋은 코드가 나오지만 무분별하게 사용하게 된다면 코드의 퀄리티가 떨어지기에 추천하는 방법은 아니다.

마지막으로는 예외 전환이다.

예외 전환은 예외를 적절한 예외로 전환해서 자신을 호출할 쪽으로 던져버리는 방법으로 아래와 같은 방법으로 예외를 전환시킨다.

public static void main(String[] args) { byte[] list = {'a', 'b', 'c'}; try { System.out.write(list); } catch (IOException e) { throw new RuntimeException("list를 읽지 못했습니다."); } }

보통 실무에서는 예외 처리를 하기 위해서 아래와 같은 방법으로 RuntimeException을 상속받은 클래스를 만들어서 예외 전환 방법으로 예외를 처리한다.

public class CustomException extends RuntimeException{ public CustomException(String message) { super(message); } }

결국 잘 짠 코드는 그냥 로직이 잘 돌아가면 되는 게 아니라 이런 예외 처리에도 하나하나 다 신경써서 만들어진 코드를 말하는것 같다.

백기선님 유튜브에서 잘못된 부분을 지적해주신 트랜잭션 관련 부분을 삭제했습니다. ( 참고 : //www.youtube.com/watch?v=_WkMhytqoCc )

Toplist

최신 우편물

태그