Java

[JAVA] 예외처리 - Exception 이해하기

jh4dev 2024. 8. 15. 18:27
<목차>

1. Error & Exception
2. Exception Class 구조
3. Exception 처리 방법

 

[Error & Exception]

Error / 에러

JAVA 에서 Error 는 JVM에서 발생시키는 것으로, 애플리케이션 코드에서 처리할 수 있는 부분이 거의 없다.

대표적으로, OutOfMemory / StackOverFlow 등이 에러에 속하며, 에러가 발생한 시점에 처리하기 보다는 미리미리 애플리케이션의 코드를 살펴보며 에러가 발생하지 않도록 예방하여 원천적으로 차단해야 한다.

 

Exception / 예외

Exception 은 입력 값의 처리가 불가능하거나 참조된 값이 잘못된 경우 등, 애플리케이션이 정상적으로 동작하지 못하는 상황을 의미한다.

코드 설계 및 테스트 단계에서 개발자가 직접 처리할 수 있는 내용이다.


[Exception Class 구조]

JAVA 에서 Exception 클래스들의 상속 구조는 다음과 같다.

 

  • Exception 클래스들은 Throwable 클래스를 상속받고 있다.
  • 다양한 Exception 클래스들 (IOException / RuntimeException ... ) 등은 Exception 클래스를 상속받고 있다.
    이러한 다양한 종류의 Exception 들은 두 가지 구분으로 나눌 수 있다.
    1. Checked Exception
      • 반드시 예외 처리가 필요하다.
      • 컴파일 단계에서 확인 가능하다.
      • Ex) IOException / SQLException / ClassNotFoundException ...
    2. Unchecked Exception
      • 문법 상 문제는 없지만, 프로그램이 동작하던 중 예기치 않은 상황이 발생하는 케이스 
      • 명시적 처리를 강제하지 않는다.
      • 실행 중 단계 (Runtime) 에서 확인 가능하다.
      • RuntimeException 을 상속받는 Exception 클래스는 모두 이에 해당한다.

[Exception 처리 방법]

예외 상황은 크게 세 가지 방법으로 처리한다.
  1. 예외 복구
    • 예외 상황을 파악하여 문제를 해결하는 방식을 의미한다.
    • try / catch 구문을 사용하며,
      try 문에서는 예외가 발생할 수 있는 코드를 작성하고
      catch 문에서는 try 에서 예외가 발생했을 시, 예외 상황을 처리하는 내용을 작성한다.
  2. 예외 처리 회피
    • 예외가 발생한 시점에 바로 처리하는 것이 아니라, 예외가 발생한 메서드를 호출한 곳에서 예외 처리를 할 수 있도록 전가하는 형태를 의미한다.
    • throw 키워드를 사용하여, 어떤 Exception 이 발생했는지를 호출부로 전달한다.
  3. 예외 전환
    • 예외가 발생했을 때, 어떤 예외가 발생했느냐에 따라, 호출부로 예외 내용을 전달하며 보다 적합한 타입으로 전환하여 전달할 필요가 있는 경우를 의미한다.
    • 또는 애플리케이션에서 예외처리를 보다 단순히 만들기 위해 wrapping 하는 경우에도 사용된다.
    • 흔히, 프로젝트에서 커스텀 Exception 을 구성하는 방법이다.

 

<예외 복구 Simple Example>

    String s = "s";
    try {
        System.out.println(Integer.parseInt(s));
    } catch (Exception e) {
        s = "1";
        System.out.println(Integer.parseInt(s));
    }

 

<예외 처리 회피 Simple Example>

    String s = "s";
    try {
        System.out.println(Integer.parseInt(s));
    } catch (NumberFormatException e) {
        throw new NumberFormatException("Not a Number");
    }

 

<예외 전환 Simple Example>

    String s = "s";
    try {
        System.out.println(Integer.parseInt(s));
    } catch (NumberFormatException e) {
        throw new CustomException(500, "Not a Number");
    }

 

'Java' 카테고리의 다른 글

[Java] Lombok 롬복 라이브러리  (0) 2024.07.26