개발/JAVA

Java 예외 처리: 기본부터 사용자 정의 예외까지

예니03 2025. 1. 15. 11:00
반응형

Java 프로그램을 작성하다 보면 다양한 오류에 직면하게 됩니다. 이를 "예외(Exception)"라고 하며, 예외를 제대로 처리하지 않으면 프로그램이 갑자기 종료될 수 있습니다. 이번 포스팅에서는 예외 처리의 기본 개념부터 사용자 정의 예외를 활용하는 방법까지 알아보겠습니다.

1. 예외 처리란?

예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 처리하여, 프로그램이 갑작스럽게 종료되지 않고 안정적으로 동작하도록 돕는 과정입니다.

예외의 두 가지 유형:

  1. Checked Exception: 컴파일 시 반드시 처리해야 하는 예외
    예: IOException, SQLException
  2. Unchecked Exception: 런타임에서 발생하며, 처리하지 않아도 컴파일 오류가 발생하지 않음
    예: NullPointerException, ArithmeticException

2. 예외 처리 기본 구조

Java에서 예외를 처리하는 기본 구조는 try-catch-finally 문을 사용합니다.

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType e) {
    // 예외 처리 코드
} finally {
    // 항상 실행되는 코드 (선택적)
}

예제: NullPointerException 처리

public class NullPointExceptionEx {
    public static void main(String[] args) {
        String str = null; // null 값 할당
        try {
            System.out.println(str.toString()); // 예외 발생
        } catch (NullPointerException e) {
            System.err.println("널 입니다."); // 예외 메시지 출력
        } finally {
            System.out.println("예외처리 종료"); // 항상 실행
        }
    }
}

실행 결과:

널 입니다.
예외처리 종료

 

3. 사용자 정의 예외 만들기

Java는 기본 제공 예외 외에도 개발자가 직접 예외 클래스를 정의하여 사용할 수 있습니다. 이를 통해 오류 상황에 대한 구체적인 정보를 제공할 수 있습니다.

사용자 정의 예외 클래스 생성

class CustomArithException extends ArithmeticException {
    private int num1;
    private int num2;

    public CustomArithException(String message, int num1, int num2) {
        super(message); // 부모 클래스 생성자 호출
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getNum1() {
        return num1;
    }

    public int getNum2() {
        return num2;
    }
}

 

4. Checked 및 Unchecked Exception 처리

Checked Exception 처리: IOException

public void executeExcept() throws IOException {
    System.out.println("강제 예외 발생!");
    throw new IOException("강제 예외!"); // Checked Exception 발생
}

executeExcept 메서드는 Checked Exception인 IOException을 던집니다.
따라서 반드시 try-catch로 처리하거나, 메서드 선언부에 throws로 명시해야 합니다.

 

Unchecked Exception 처리: RuntimeException

public void executeRuntimeException() {
    throw new RuntimeException("런타임 익셉션");
}

Unchecked Exception인 RuntimeException은 컴파일 시 예외 처리를 강제하지 않습니다.
하지만 처리하지 않으면 런타임에서 프로그램이 종료될 수 있으므로, 안정성을 위해 예외 처리가 권장됩니다.

 

5. 사용자 정의 예외 활용

예제: 0으로 나누기 예외 처리

public double divide(int num1, int num2) {
    try {
        return num1 / num2;
    } catch (ArithmeticException e) {
        throw new CustomArithException("사용자 정의 Exception", num1, num2);
    }
}

ArithmeticException을 사용자 정의 예외로 변환하여, 보다 구체적인 정보를 제공합니다.

 

6. 모든 예외 처리 통합

통합 예제 코드

public static void main(String[] args) {
    ThrowsExcept except = new ThrowsExcept();

    try {
        except.divide(100, 0); // 사용자 정의 예외 발생
        except.executeRuntimeException(); // 런타임 예외 발생
        except.executeExcept(); // CheckedException 발생
    } catch (IOException e) {
        System.err.println("IOException: " + e.getMessage());
    } catch (CustomArithException e) {
        System.err.println("에러 메시지: " + e.getMessage());
        System.err.println("나누어지는 수: " + e.getNum1());
        System.err.println("나누는 수: " + e.getNum2());
    } catch (RuntimeException e) {
        System.err.println("RuntimeException: " + e.getMessage());
    }
}

 

 

7. 실행 결과

사용자 정의 예외 발생:

에러 메시지: 사용자 정의 Exception
나누어지는 수: 100
나누는 수: 0

 

 

Unchecked Exception 발생:

RuntimeException: 런타임 익셉션

 

Checked Exception 발생:

IOException: 강제 예외!

 

8. 결론

이번 포스팅에서는 Java의 예외 처리 구조와 사용자 정의 예외 활용법을 살펴봤습니다. 예외 처리는 프로그램의 안정성을 보장하고, 오류 발생 시 정확한 원인을 파악하는 데 필수적입니다.

핵심 정리:

  • 예외는 try-catch-finally로 처리합니다.
  • Checked Exception은 반드시 처리해야 하며, Unchecked Exception은 선택적입니다.
  • 사용자 정의 예외를 사용하면 보다 구체적이고 의미 있는 오류 정보를 제공할 수 있습니다.
반응형