일상/챗지피티 선생님

챗지피티에게 물어본 try/catch 예외 처리 방법

파티피플지선 2024. 12. 30. 17:42

Java에서 try/catch 구문을 사용하여 예외를 처리하는 경우는 여러 가지가 있습니다. 예외는 프로그램 실행 중 발생할 수 있는 오류 상황을 처리하기 위해 사용되며, try/catch 구문은 예외가 발생할 수 있는 코드 블록을 감싸고, 발생한 예외를 처리하는 데 사용됩니다. 주요 경우들을 다음과 같이 정리할 수 있습니다.

1. 기본적인 try/catch 예외 처리

가장 기본적인 형태로, 예외가 발생할 가능성이 있는 코드를 try 블록 안에 두고, 예외가 발생했을 때 이를 처리할 catch 블록을 사용합니다.

try {
    // 예외가 발생할 수 있는 코드
    int result = 10 / 0;
} catch (ArithmeticException e) {
    // 예외를 처리하는 코드
    System.out.println("ArithmeticException 발생: " + e.getMessage());
}

2. 여러 개의 예외 처리

하나의 try 블록에서 여러 종류의 예외를 처리할 수 있습니다. 이를 위해 여러 catch 블록을 사용합니다.

try {
    // 예외가 발생할 수 있는 코드
    String str = null;
    str.length();
} catch (NullPointerException e) {
    // NullPointerException 처리
    System.out.println("NullPointerException 발생: " + e.getMessage());
} catch (Exception e) {
    // 다른 모든 예외 처리
    System.out.println("예기치 않은 예외 발생: " + e.getMessage());
}

3. 다중 예외 타입을 하나의 catch로 처리하기 (Java 7 이상)

Java 7부터는 여러 개의 예외 타입을 하나의 catch 블록에서 처리할 수 있습니다. 이때 각 예외 타입은 | 연산자로 구분합니다.

try {
    // 예외가 발생할 수 있는 코드
    String str = null;
    str.length();
} catch (NullPointerException | ArithmeticException e) {
    // 여러 예외를 처리
    System.out.println("예외 발생: " + e.getMessage());
}

4. 예외 발생 후 처리 (finally 블록)

finally 블록은 예외가 발생하든 발생하지 않든 항상 실행되는 블록입니다. 예를 들어, 자원을 해제하거나, 데이터베이스 연결을 닫는 등의 처리를 할 때 사용됩니다.

try {
    // 예외가 발생할 수 있는 코드
    int result = 10 / 0;
} catch (ArithmeticException e) {
    // 예외를 처리하는 코드
    System.out.println("ArithmeticException 발생: " + e.getMessage());
} finally {
    // 예외 발생 여부와 관계없이 항상 실행
    System.out.println("finally 블록 실행");
}

5. try/catch 중첩 (Nested try/catch)

try/catch 구문은 중첩하여 사용할 수 있습니다. 예외 처리에서 예외가 또 발생할 수 있는 경우 중첩된 try/catch를 사용합니다.

try {
    // 외부 예외가 발생할 수 있는 코드
    try {
        // 내부 예외가 발생할 수 있는 코드
        String str = null;
        str.length();
    } catch (NullPointerException e) {
        System.out.println("내부 예외 발생: " + e.getMessage());
    }
} catch (Exception e) {
    System.out.println("외부 예외 발생: " + e.getMessage());
}

6. throw와 함께 사용하여 예외 던지기

throw를 사용하여 예외를 명시적으로 던질 수 있으며, 이때 예외는 호출된 try/catch 구문으로 전달됩니다.

try {
    throw new Exception("예외 강제 발생");
} catch (Exception e) {
    System.out.println("예외 처리: " + e.getMessage());
}

7. throws와 함께 예외 전파하기

메서드에서 예외를 처리하지 않고, 호출한 곳으로 예외를 전파하려면 throws를 사용하여 예외를 선언합니다. 이때 호출한 곳에서 예외를 처리해야 합니다.

public void someMethod() throws IOException {
    throw new IOException("파일 읽기 오류");
}

try {
    someMethod();
} catch (IOException e) {
    System.out.println("IOException 처리: " + e.getMessage());
}

8. Checked Exception과 Unchecked Exception 구분

  • Checked Exception: IOException, SQLException 등 컴파일 타임에서 반드시 처리해야 하는 예외. 이 예외들은 try/catch 또는 throws로 처리해야 합니다.
  • Unchecked Exception: NullPointerException, ArrayIndexOutOfBoundsException 등 런타임 예외. 이들은 선택적으로 처리할 수 있습니다.

9. try-with-resources (Java 7 이상)

try-with-resources는 자원(예: 파일, 데이터베이스 연결 등)을 자동으로 닫아주는 기능입니다. AutoCloseable 인터페이스를 구현한 객체에 대해 사용합니다.

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    System.out.println("파일 읽기 오류: " + e.getMessage());
}
// 자동으로 br.close()가 호출됨

결론

try/catch 구문을 사용하여 예외를 처리하는 방법에는 다양한 패턴이 있습니다. 예외 발생 가능성이 있는 코드 블록을 감싸고, 발생한 예외를 적절히 처리할 수 있는 방법을 선택하는 것이 중요합니다. 예외를 처리하는 방식은 코드의 안정성 및 가독성에 큰 영향을 미치므로, 상황에 맞는 예외 처리 방법을 선택해야 합니다.