# Table of Contents

# Java 예외 처리

Java의 예외 처리에 대해 알아보자.

# Throwable

Java는 오류가 발생하면 ErrorException을 발생시킨다. ErrorException은 모두 Throwable클래스를 상속한다.

# Error

Error는 코드에서 잡아낼 수 없으며 어플리케이션 자체가 다운된다. 대표적으로 메모리가 부족하여 발생하는 OutOfMemoryError, StackOveflowError가 있다.

# Exception

Exceptiontry-catch구문으로 잡아낼 수 있으며 프로그램이 다운되지 않도록 처리할 수 있다. 대표적으로 값이 null인 변수에 접근하면 발생하는 NullPointException이 있다.

아래 코드를 살펴보자.

Person person = null;

// 값이 null인 변수에 접근하고 있다.
person.printName();

값이 null인 변수에 접근하고 있다. 위 코드를 실행하면 NullPointException이 발생하고 어플리케이션이 다운된다.

# try catch

이때 try-catch구문으로 Exception이 발생할 가능성이 있는 부분을 감싸주면 Exception이 발생해도 어플리케이션을 다운시키지 않고 에러 처리를 할 수 있다.

Person person = null;

try {
    // 값이 null인 변수에 접근하고 있습니다.
    person.printName();
} catch (NullPointerException nullPointerException) {
    nullPointerException.printStackTrace();
}

개발자가 직접 Exception을 정의하고 발생시킬 수 있다.

class CustomException extends Exception {
    CustomException(String message) {
        super(message);
    }
}

직접 Exception을 발생시킬 때는 키워드throw를 사용한다.

try {
    throw new CustomException("CustomException");
} catch (CustomException customException) {
    customException.printStackTrace();
}

Exception을 발생시킬 가능성이 있는 함수 뒤에는 키워드throws를 사용하여 가능성을 표시할 수 있다.

void doSomething() throws CustomException {
    throw new CustomException("Custom Exception");
}

키워드throws가 붙은 함수는 try-catch구문 안에서 사용해야한다.

try {
    doSomething();
} catch (CustomException customException) {
    customException.printStackTrace();
}

# Unchecked Exception vs. Checked Exception

RuntimeException을 상속하는 클래스를 Unchecked Exception라고 한다. 이 예외는 코드에서의 예외처리를 강제하지 않는다. 대표적으로 NullPointException, ClassCastException 등이 있다.

RuntimeException을 상속하지 않는 클래스를 Checked Exception라고 한다. 이 예외에서는 코드에서의 예외처리를 강제한다. 따라서 try-catch 문으로 감싸주거나 throw 구문으로 예외처리를 전가해야한다. 대표적으로 IOException, ClassNotFoundException 등이 있다.