Java

[Java][Tutorial] 2-1. Essential Java Classes: Exceptions

noahkim_ 2023. 10. 15. 16:49

1. Exceptions

What Is an Exception?

  • 프로그램이 정상 흐름에서 벗어나 중단된 상황을 뜻합니다.
  • Java는 예외적인 이벤트나 에러를 핸들링하기 위해 Exception 클래스를 사용합니다.

 

Exception
  • 예외 상황에 대한 정보를 가집니다.
  • Exception 인스턴스를 생성해서 JVM에게 전달합니다.

 

Exception Handling

  • 메서드 내에서 에러가 발생 시, JVM으로부터 처리됩니다.
  • call stack을 하나씩 내려가면서 처리될 catch 블록을 탐색합니다.
    • call stack을 하나씩 내려가면서, 던져진 예외타입에 매칭되는 catch 블록을 순차적으로 탐색합니다.
    • 별도로 작성된 서브타입에 대한 예외처리 핸들러를 먼저 작성하여 처리되도록 해야 합니다.
  • catch 블록을 찾지못하면 jvm의 default exception handler에 의해 처리됩니다.

 

The Catch or Specify Requirement

Catching and Handling Exceptions
  • try-catch-finally: exception을 처리하기 위한 구문입니다.
    • try: exception 발생 가능성이 있는 코드를 포장하는 구문
    • catch: exception handler를 작성하는 구문
      • 처리할 exception type의 handler를 작성합니다.
      • 여러 타입의 예외를 하나의 exception handler로 처리 (vertical bar 사용)(Java 7~)
    • finally: 마지막에 언제나 호출되는 구문입니다. (exception 발생 상관 X)
  • try-with-resources (Java 7~)
    • try 구문 종료 후, 사용되는 resource의 메모리 해제를 자동으로 수행합니다.
    • Closeable 인터페이스 구현체만 선언이 가능합니다.

 

throws 절
  • exception propagation
    • 해당 메서드의 호출자에게 예외처리 책임을 위임합니다.
    • 발생한 예외 처리를 현재 메서드에서 직접 처리하지 않고, 메서드를 호출한 상위 메서드로 전파하여 처리할 수 있습니다.
  • 실행 중 발생할 수 있는 Checked Exception을 명시합니다.
    • 호출자에게 해당 Checked Exception에 대한 처리를 준비해야 함을 알릴 수 있습니다.
  • RuntimeException이 자동으로 추가되어 있습니다. (추가적인 명시 X)

 

2. How to Throw Exceptions

Throwable Class and Its Subclasses

Throwable
  • 모든 에러와 예외의 최상위 클래스입니다.
  • 프로그램에서 비정상적인 상황을 나타내기 위한 클래스입니다.
  • 하위 클래스로는 Error와 Exception이 있습니다.
 

Error

  • 심각한 문제를 나타낼 때 발생합니다. (애플리케이션 수준 X)
  • 일반적으로 애플리케이션에서 처리하지 않으며, 대부분 복구 불가능한 상태를 의미합니다.

 

StackOverflowError
  • JVM 스택메모리가 넘칠 때 발생합니다.

 

OutOfMemoryError
  • 힙 메모리나 메타스페이스 메모리가 부족할 때 발생합니다.

 

Exception (checked exception)

  • 애플리케이션 수준의 문제 발생을 나타냅니다. (시스템의 심각한 문제 X)
  • 예측 가능한 예외상황에서 사용됩니다.
    • 대체로 외부 요인에 의해 발생하는 예외 입니다.
  • 컴파일러에 의해 예외처리가 강제됩니다.
  • Exception 클래스 혹은 그 하위 클래스입니다.

 

IllegalAccessException
  • 특정 메서드를 찾을 수 없을 때 발생합니다.

 

NegativeArraySizeException
  • 프로그램이 음수 크기의 배열을 생성하려고 할 때 발생합니다.

 

RuntimeException (unchecked exception)

  • 애플리케이션 수준에서 개발자의 잘못된 API 사용에 대한 예외를 나타냅니다.
  • 예측 가능하지 않은 예외상황에서 사용됩니다. (런타임에 발견)
  • 컴파일러에 의해 예외처리가 강제되지 않습니다.
  • RuntimeException의 하위 클래스입니다.

 

NullPointerException
  • null 참조로 객체의 멤버에 액세스하려고 할 때 발생합니다.

 

Chained Exceptions

  • 한 예외가 다른 예외를 발생시키는 경우에 사용되는 기능입니다.
  • 연쇄적인 예외 발생 상황을 효과적으로 처리하기 위해 사용됩니다.
    • 특정 상황에서 발생하는 예외가 다른 예외를 일으킬 수 있습니다.
    • 예외의 원인이 되는 예외를 함께 전달하여, 예외의 연쇄적인 원인을 쉽게 파악하고 처리할 수 있도록 도와줍니다.

 

Throwable 생성자
Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)
  • 예외의 원인이 되는 클래스를 전달합니다.

 

public class ChainedExceptionDemo {
    public static void main(String[] args) {
        try {
            testMethod();
        } catch (CustomException e) {
            e.printStackTrace();
        }
    }

    public static void testMethod() throws CustomException {
        try {
            exceptionMethod();
        } catch (NumberFormatException e) {
            throw new CustomException("Number Format is Incorrect!", e);
        }
    }

    public static void exceptionMethod() {
        int num = Integer.parseInt("NotANumber");
    }
}

class CustomException extends Exception {
    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }
}

 

 

 

출처