본문 바로가기
Java

[JAVA] 예외처리(Exception)

by goblin- 2024. 9. 24.

자바의 예외 처리(Exception Handling)는 프로그램 실행 중에 발생할 수 있는 오류(에러)나 예외적인 상황을 처리하는 메커니즘입니다. 자바는 예외를 처리하기 위해 try-catch-finally 블록, throwthrows 키워드, 그리고 사용자 정의 예외(Custom Exception) 등을 제공합니다. 자바의 예외 처리 시스템은 프로그램의 안정성유지보수성을 높여주는 중요한 기능입니다.

 

1. 예외란 무엇인가?

 

**예외(Exception)**는 프로그램 실행 중에 발생하는 비정상적인 상황을 의미합니다. 예외가 발생하면 프로그램의 정상적인 흐름이 중단될 수 있으며, 이를 적절히 처리하지 않으면 프로그램이 비정상 종료될 수 있습니다.

 

자바에서 예외는 Throwable 클래스를 상속받는 두 가지 주요 클래스로 구분됩니다:

 

Exception: 프로그램에서 발생할 수 있는 예외적인 상황을 나타냅니다. 주로 개발자가 처리해야 하는 문제들입니다.

Error: 시스템 레벨에서 발생하는 심각한 오류를 나타냅니다. 개발자가 직접 처리할 수 없는 문제들로, JVM에서 발생하는 문제가 대부분입니다. 예: OutOfMemoryError, StackOverflowError

 

2. 예외의 종류

 

자바의 예외는 크게 Checked 예외Unchecked 예외로 나뉩니다.

 

1. Checked 예외

 

Checked 예외컴파일 시점에 반드시 처리해야 하는 예외입니다. 컴파일러가 이 예외를 처리하도록 강제하며, throws 키워드를 통해 예외가 발생할 수 있음을 선언하거나, try-catch 블록으로 반드시 예외를 처리해야 합니다.

예시: IOException, SQLException, ClassNotFoundException

 

Checked 예외 예시:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            File file = new File("non_existent_file.txt");
            FileReader fileReader = new FileReader(file);  // FileNotFoundException 발생 가능
        } catch (FileNotFoundException e) {
            System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
        }
    }
}

 

2. Unchecked 예외

 

Unchecked 예외런타임 시점에 발생하는 예외로, 컴파일러가 강제하지 않습니다. 주로 프로그래밍 실수나 논리적 오류로 인해 발생하며, 개발자가 예방해야 하는 예외입니다. RuntimeException 클래스를 상속받은 예외들이 여기에 해당합니다.

예시: NullPointerException, ArithmeticException, ArrayIndexOutOfBoundsException

 

Unchecked 예외 예시:

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        System.out.println(numbers[3]);  // ArrayIndexOutOfBoundsException 발생
    }
}

 

3. 자바에서 예외 처리하기

 

자바에서는 예외가 발생했을 때 이를 처리하기 위한 구조를 제공합니다. 이 구조는 프로그램이 비정상적으로 종료되지 않도록 하고, 예외 발생 시 적절한 대처를 할 수 있게 해줍니다.

 

1. try-catch 블록

 

try 블록: 예외가 발생할 가능성이 있는 코드를 작성하는 곳입니다.

catch 블록: try 블록에서 예외가 발생하면, 해당 예외를 처리하기 위한 코드를 작성하는 곳입니다.

try {
    // 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
    // 예외 처리 코드
}

 

2. finally 블록

 

finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드를 작성하는 곳입니다. 주로 자원 해제(파일 닫기, 데이터베이스 연결 종료 등)에 사용됩니다.

try {
    // 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
    // 예외 처리 코드
} finally {
    // 예외 발생 여부와 상관없이 항상 실행되는 코드
}

 

3. throw와 throws 키워드

 

throw 키워드

 

throw 키워드는 프로그래머가 직접 예외를 발생시키는 데 사용합니다. 주로 조건에 맞지 않는 상황에서 사용자 정의 예외나 기존 예외를 발생시킬 때 사용합니다.

public void checkAge(int age) {
    if (age < 18) {
        throw new IllegalArgumentException("나이가 너무 적습니다.");
    }
}

 

throws 키워드

 

throws 키워드는 메서드 선언부에서 이 메서드가 어떤 예외를 던질 수 있는지를 명시합니다. 이는 Checked 예외에서 주로 사용되며, 메서드를 호출하는 쪽에서 예외 처리를 강제합니다.

public void readFile(String fileName) throws FileNotFoundException {
    File file = new File(fileName);
    FileReader fileReader = new FileReader(file);
}

 

4. 예외 처리 예시

 

기본 예외 처리:

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0;  // ArithmeticException 발생
        } catch (ArithmeticException e) {
            System.out.println("예외 발생: " + e.getMessage());
        } finally {
            System.out.println("이 코드는 항상 실행됩니다.");
        }
    }
}

10 / 0에서 ArithmeticException이 발생하고, catch 블록에서 이 예외를 처리합니다. finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.

 

5. 사용자 정의 예외(Custom Exception)

 

자바에서는 기본 제공되는 예외 외에도, 사용자 정의 예외를 만들 수 있습니다. 이 방법은 특정 비즈니스 로직에 맞는 예외를 정의하고 처리할 때 유용합니다.

 

사용자 정의 예외 작성:

class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            checkAge(15);
        } catch (InvalidAgeException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }

    public static void checkAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("나이가 너무 적습니다.");
        }
    }
}

InvalidAgeException은 사용자 정의 예외로, 나이가 18세 미만일 때 발생합니다.

checkAge 메서드는 예외를 던질 수 있다고 선언하고, 나이가 조건에 맞지 않으면 예외를 발생시킵니다.

 

6. 예외 처리의 중요성

 

예외 처리는 프로그램의 안정성예측 가능성을 높여줍니다. 적절한 예외 처리가 이루어지면 프로그램이 비정상 종료되는 것을 방지하고, 문제 발생 시 이를 처리하여 프로그램이 계속 동작할 수 있도록 합니다. 특히 다음과 같은 장점이 있습니다:

 

프로그램의 안정성: 예외 처리로 인해 프로그램이 예외 발생 시에도 안전하게 종료되거나 복구할 수 있습니다.

에러 추적 용이성: 예외 발생 시 로그와 메시지를 통해 문제를 쉽게 추적하고 디버깅할 수 있습니다.

비즈니스 로직 보장: 예외 상황에서도 비즈니스 로직의 일관성을 보장할 수 있습니다.

 

요약

 

자바에서 예외는 비정상적인 상황을 의미하며, 이를 처리하지 않으면 프로그램이 중단될 수 있습니다.

예외는 try-catch-finally 블록으로 처리하며, Checked 예외와 Unchecked 예외로 구분됩니다.

throwthrows 키워드를 사용하여 예외를 발생시키고 전달할 수 있으며, 사용자 정의 예외를 만들어 특정 비즈니스 로직에 맞는 예외 처리를 할 수 있습니다.

'Java' 카테고리의 다른 글

[JAVA] Static  (0) 2024.09.24
[JAVA] 빌더(builder)  (0) 2024.09.24
[JAVA] 자바의 동작원리(JVM, JRE, JDK)  (0) 2024.09.24
[JAVA] 자바의 기본 구조  (1) 2024.09.24
[JAVA] SOLID 원칙  (1) 2024.09.22