Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 다른 try-catch 블록 내부에 try-catch 블록을 선언할 수 있나요?

네, 가능합니다. 자바에서는 하나의 try-catch 블록 안에 또 다른 try-catch 블록을 선언할 수 있으며, 이를 중첩 try-catch 블록(Nested Try-Catch Block)이라고 부릅니다.

중첩 try-catch 블록의 동작 원리

  • 내부(inner) try 블록에서 발생한 특정 예외에 대해 일치하는 catch 문이 존재하지 않으면, 제어권은 다음 try 블록의 catch 핸들러로 넘어갑니다.
  • 이 과정은 어느 한 catch 문이 성공적으로 실행되거나, 모든 중첩 try 문의 검사가 끝날 때까지 반복됩니다.
  • 만약 어떤 catch 문도 해당 예외와 일치하지 않으면, 자바 런타임 시스템(Java Runtime System)이 최종적으로 예외를 처리합니다.
  • 중첩 try 블록을 사용하면 내부 try 블록이 먼저 실행됩니다. 내부 try 블록에서 던져진 예외는 대응되는 catch 블록에서 처리되며, 일치하는 catch 블록을 찾지 못하면 외부 try 블록의 catch 블록들을 차례대로 검사합니다. 모든 중첩 try 문을 확인한 후에도 적절한 블록을 찾지 못하면 JRE(Java Runtime Environment)가 예외를 처리합니다.

문법(Syntax)

try {
    statement1;
    statement2;
    try {  // 내부 try 블록
        statement1;
        statement2;
    }
    catch(Exception e) {
        // 해당 예외를 처리
    }  
}
catch(Exception e) {  // 외부 try 블록
    // 해당 예외를 처리
}
   .............

예제 코드

아래 예제는 파일을 여는 작업과 나눗셈 연산을 서로 다른 try 블록으로 분리하여, 각 단계에서 발생하는 예외를 개별적으로 처리하는 방법을 보여줍니다.

import java.io.*;
public class NestedTryCatchTest {
   public static void main(String args[]) throws IOException {
      int n = 10, result = 0;
      try {  // 외부(outer) try 블록
         FileInputStream fis = null;
         fis = new FileInputStream(new File(args[0]));
         try {  // 내부(inner) try 블록
            result = n/0;
            System.out.println("The result is" + result);
         }
         catch(ArithmeticException e) {  // 내부 catch 블록
            System.out.println("Division by Zero");
         }
      }
      catch(FileNotFoundException e) {  // 외부 catch 블록
         System.out.println("File was not found");
      }
      catch(ArrayIndexOutOfBoundsException e) {  // 외부 catch 블록
         System.out.println("Array Index Out Of Bounds Exception occured");
      }
      catch(Exception e) {  // 외부 catch 블록
         System.out.println("Exception occured" + e);
      }
   }
}

실행 결과

Array Index Out Of Bounds Exception occured

결과 해석

위 프로그램을 명령줄 인수 없이 실행하면 args[0]에 접근하는 순간 ArrayIndexOutOfBoundsException이 발생합니다. 이 예외는 내부 try 블록이 아니라 외부 try 블록에서 발생했기 때문에, 외부 try 블록에 선언된 해당 catch 블록이 이를 잡아 위와 같은 메시지를 출력합니다.

중첩 try-catch는 언제 유용한가?

하나의 메서드 안에서 서로 다른 종류의 오류가 서로 다른 위치에서 발생할 수 있고, 각 오류를 발생 지점에 맞춰 세밀하게 처리하고 싶다면 중첩 try-catch 구조가 매우 유용합니다. 예를 들어 파일 열기 작업과 그 이후의 연산 작업을 각각 별도의 try 블록으로 감싸면, 각 단계의 예외를 독립적이고 명확하게 제어할 수 있습니다.