게으른 개발자의 끄적거림

Java 예외처리 방법(try catch finally)

끄적잉 2024. 8. 5. 22:47
728x90

Java 예외 처리(Exception Handling)는 프로그램 실행 중 발생할 수 있는 예외적인 상황을 관리하고 처리하는 메커니즘입니다. 예외 처리는 프로그램의 안정성과 신뢰성을 높이는 데 중요한 역할을 합니다. Java에서는 try, catch, 그리고 finally 블록을 사용하여 예외를 처리합니다. 각 블록의 역할과 사용법을 자세히 살펴보겠습니다.

 


## 1. 예외(Exception)란?

예외는 프로그램 실행 중 발생할 수 있는 비정상적인 상황을 말합니다. 예를 들어, 파일을 읽는 도중 파일이 존재하지 않거나, 네트워크 연결 중 연결이 끊어지는 경우 등이 예외 상황에 해당합니다. Java에서는 예외를 객체로 표현하며, 이 객체는 `Throwable` 클래스의 서브클래스입니다.

예외는 크게 두 가지로 나눌 수 있습니다:
- **체크 예외(Checked Exception)**: 컴파일 시점에서 반드시 처리해야 하는 예외입니다. 예를 들어, 파일 입출력이나 네트워크 관련 예외가 이에 해당합니다.
- **언체크 예외(Unchecked Exception)**: 실행 시점에서 발생하는 예외로, 컴파일러가 예외 처리 여부를 검사하지 않습니다. 주로 프로그래머의 실수로 인해 발생합니다. 예를 들어, `NullPointerException`, `ArrayIndexOutOfBoundsException` 등이 있습니다.

 


## 2. try, catch, finally 블록의 기본 구조

예외 처리는 기본적으로 try, catch, finally 블록을 통해 이루어집니다. 각 블록의 역할은 다음과 같습니다.

- **try 블록**: 예외가 발생할 가능성이 있는 코드를 포함합니다. 예외가 발생하면 해당 예외는 catch 블록으로 전달됩니다.
- **catch 블록**: try 블록에서 발생한 예외를 처리합니다. 각 catch 블록은 특정한 타입의 예외를 처리하도록 설계될 수 있습니다.
- **finally 블록**: 예외 발생 여부와 상관없이 항상 실행되는 블록입니다. 주로 자원 해제 등의 클린업 작업을 수행합니다.

기본 구조는 다음과 같습니다:

```java
try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType1 e1) {
    // ExceptionType1 예외 처리
} catch (ExceptionType2 e2) {
    // ExceptionType2 예외 처리
} finally {
    // 항상 실행되는 클린업 코드
}
```

 


## 3. try 블록

try 블록은 예외가 발생할 가능성이 있는 코드를 포함합니다. 예를 들어, 파일을 여는 코드, 네트워크 연결을 시도하는 코드, 또는 배열에 접근하는 코드 등이 try 블록에 포함될 수 있습니다.

예제:
```java
try {
    int[] numbers = {1, 2, 3};
    System.out.println(numbers[3]); // ArrayIndexOutOfBoundsException 발생
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("배열의 인덱스가 잘못되었습니다.");
} finally {
    System.out.println("예외 처리 완료.");
}
```

이 예제에서 `numbers[3]`은 배열의 유효 범위를 벗어나기 때문에 `ArrayIndexOutOfBoundsException`이 발생합니다. 이 예외는 catch 블록에서 처리됩니다.

 


## 4. catch 블록

catch 블록은 try 블록에서 발생한 특정 예외를 처리합니다. 각 catch 블록은 특정 타입의 예외를 처리하도록 설계될 수 있으며, 여러 개의 catch 블록을 사용할 수 있습니다.

예제:
```java
try {
    int[] numbers = {1, 2, 3};
    System.out.println(numbers[3]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("배열 인덱스 초과 예외 발생: " + e.getMessage());
} catch (Exception e) {
    System.out.println("일반 예외 발생: " + e.getMessage());
}
```

위 예제에서는 `ArrayIndexOutOfBoundsException`이 발생하면 첫 번째 catch 블록이 실행됩니다. 만약 다른 종류의 예외가 발생하면 두 번째 catch 블록이 실행됩니다.

 


## 5. finally 블록

finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 블록입니다. 주로 자원을 해제하거나 클린업 작업을 수행하는 데 사용됩니다.

예제:
```java
try {
    int[] numbers = {1, 2, 3};
    System.out.println(numbers[3]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("배열 인덱스 초과 예외 발생: " + e.getMessage());
} finally {
    System.out.println("클린업 작업 실행.");
}
```

이 예제에서 finally 블록은 예외가 발생하더라도 항상 실행되어 "클린업 작업 실행." 메시지를 출력합니다.

 


## 6. 자원 해제와 try-with-resources

Java 7부터 도입된 try-with-resources 문법은 자원 해제를 보다 간편하게 할 수 있도록 도와줍니다. `AutoCloseable` 인터페이스를 구현한 자원은 try-with-resources 문법을 통해 자동으로 닫힙니다.

예제:
```java
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    System.out.println("파일 읽기 오류: " + e.getMessage());
}
```

이 예제에서는 try-with-resources 문법을 사용하여 `BufferedReader` 객체를 생성합니다. try 블록이 끝나면 `BufferedReader`는 자동으로 닫힙니다.

 


## 7. 사용자 정의 예외

Java에서는 사용자 정의 예외를 만들 수 있습니다. 사용자 정의 예외는 `Exception` 클래스를 상속하여 생성합니다.

예제:
```java
class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            throw new CustomException("사용자 정의 예외 발생");
        } catch (CustomException e) {
            System.out.println(e.getMessage());
        }
    }
}
```

이 예제에서는 `CustomException`이라는 사용자 정의 예외를 만들고, 이를 던지고 처리하는 방법을 보여줍니다.

 


## 8. 예외의 전파

메서드에서 예외가 발생하면 이를 호출한 메서드로 전파될 수 있습니다. 예외를 전파하기 위해서는 메서드 선언부에 `throws` 키워드를 사용합니다.

예제:
```java
public class Main {
    public static void main(String[] args) {
        try {
            method();
        } catch (CustomException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void method() throws CustomException {
        throw new CustomException("메서드에서 발생한 예외");
    }
}
```

이 예제에서는 `method` 메서드에서 예외가 발생하고, 이를 `main` 메서드로 전파하여 처리합니다.

 


## 9. 결론

Java의 예외 처리 메커니즘은 프로그램의 안정성을 높이고, 비정상적인 상황을 적절히 관리할 수 있도록 도와줍니다. try, catch, finally 블록을 사용하여 예외를 처리하고, 자원을 해제하며, 필요에 따라 사용자 정의 예외를 만들어 사용할 수 있습니다. 이러한 예외 처리 기법을 통해 프로그램의 오류를 최소화하고, 유지보수성을 높일 수 있습니다.

728x90