Java에서 여러 예외 잡기

Feb 17 2023
Java에서 여러 예외를 처리하기 위해 다음을 수행할 수 있습니다. 여러 catch 블록 Java에서 단일 try 블록은 여러 catch 블록을 가질 수 있습니다. Java에서 여러 catch 블록이 필요한 이유는 무엇입니까? Java의 여러 catch 블록은 다양한 유형의 예외를 처리하는 데 사용됩니다.

Java에서 여러 예외를 처리하기 위해 다음을 수행할 수 있습니다.

  • 여러 Catch 블록 사용: 여기에서 해당 try 블록에 대한 여러 catch 블록에서 여러 예외를 처리할 수 있습니다. 프로그램 흐름은 자동으로 하나씩 catch 블록에 도달한 다음 예외에 따라 해당 catch 블록을 찾아 그에 따라 처리됩니다.
  • Catch 블록의 인수에서 여러 Catch 문 사용: 이 기능은 Java 7에서 제공되었습니다. 여기에서 해당 try 블록에 대한 단일 catch 블록(파이프 기호로 구분)에서 여러 예외를 처리할 수 있습니다. 프로그램 흐름은 자동으로 catch 블록으로 이동한 다음 catch 블록의 인수 내에서 해당 예외가 try 블록에 대해 발견되고 그에 따라 처리됩니다.

다중 캐치 블록

Java에서 단일 try 블록은 여러 catch 블록을 가질 수 있습니다.

Java에서 여러 catch 블록이 필요한 이유는 무엇입니까?

Java의 여러 catch 블록은 다양한 유형의 예외를 처리하는 데 사용됩니다. 단일 try 블록의 문이 여러 예외를 생성하는 경우 다양한 유형의 예외를 처리하기 위해 여러 catch 블록이 필요합니다. 이 메커니즘을 java 에서 multi-catch 블록 이라고 합니다 .

try 블록 다음에는 하나 이상의 catch 블록이 올 수 있습니다. 각 catch 블록은 서로 다른 예외 처리기를 포함해야 합니다. 다른 예외 처리기가 포함된 경우 다른 catch 블록 에서 다른 예외를 catch할 수 있습니다 . try 블록에서 예외가 발생하면 해당 예외를 처리하는 해당 catch 블록이 실행됩니다. 따라서 다른 예외 발생 시 다른 작업을 수행해야 하는 경우 Java의 multi-try catch를 사용할 수 있습니다.

통사론

Java에서 둘 이상의 catch 블록으로 단일 시도를 사용하는 구문은 다음과 같습니다.

try 
{ 
  statements; 
} 
catch(ExceptionType1 e1) 
{ 
  statements; 
} 
catch(ExceptionType2 e2) 
{ 
  statements; 
}

던져진 예외 객체가 첫 번째 catch 블록과 일치하지 않는 경우 두 번째 catch 블록이 확인하는 식입니다.

한 번에 하나의 예외만 발생하고 한 번에 하나의 catch 블록만 실행됩니다. 모든 catch 블록은 예외가 첫 번째 하위 클래스에서 나온 다음 상위 클래스에서 오는 방식으로 배열되어야 합니다. 즉, ArithmeticException에 대한 catch가 Exception에 대한 catch보다 먼저 와야 합니다.

멀티캐치 블록 흐름도

예

예 1

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException e) {
      System.out.println(e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    } 
  }
}

/ by zero

  • 숫자를 0으로 나누려고 하기 때문에 ArithmeticException이 발생합니다.
  • ArrayIndexOutOfBoundException은 배열 범위가 0에서 9까지인 새로운 정수 배열을 선언했고 인덱스 10에 값을 할당하려고 하기 때문입니다.

대입 연산자 = 의 연관성은 오른쪽에서 왼쪽이므로 / 메시지와 함께 ArithmeticException 이 먼저 발생합니다.

예 2

class Example2{
   public static void main(String args[]){
     try{
         int a[]=new int[7];
         a[4]=30/0;
         System.out.println("First print statement in try block");
     }
     catch(ArithmeticException e){
        System.out.println("Warning: ArithmeticException");
     }
     catch(ArrayIndexOutOfBoundsException e){
        System.out.println("Warning: ArrayIndexOutOfBoundsException");
     }
     catch(Exception e){
        System.out.println("Warning: Some Other exception");
     }
   System.out.println("Out of try-catch block...");
  }
}

Warning: ArithmeticException
Out of try-catch block...

하나의 예외 처리기로 둘 이상의 예외 유형 잡기

Java 7 이상에서는 단일 catch 블록에서 여러 예외를 처리하도록 catch 블록이 개선되었습니다 . 여러 예외를 포착하고 유사한 코드가 있는 경우.

단일 catch 블록은 각 예외를 |로 구분하여 여러 예외를 처리(catch)할 수 있습니다. (파이프 기호) catch 블록에 있습니다.

이 기능은 코드 중복을 줄이고 효율성을 높이며 지나치게 광범위한 예외를 포착하려는 유혹을 줄입니다. 이 프로그램을 컴파일하는 동안 생성된 바이트 코드는 코드 중복이 없기 때문에 여러 catch 블록 이 있는 프로그램보다 작습니다.

각 catch 블록에 중복 코드가 포함된 다음 예제를 고려하십시오.

catch (IOException ex) {
     logger.log(ex);
     ex.printStackTrace();
catch (SQLException ex) {
     logger.log(ex);
     ex.printStackTrace();
}

Java SE 7 이상에서는 이 접근 방식을 사용하여 중복 코드를 제거할 수 있습니다.

통사론

절 에서 catch블록이 처리할 수 있는 예외 유형을 지정하고 각 예외 유형을 세로 막대( |)로 구분합니다.

try {
  // code
} catch (ExceptionType1 | Exceptiontype2 ex) { 
  // catch block
}

예

예 1

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

/ by zero

이 프로그램을 컴파일하는 동안 생성되는 바이트 코드는 코드 중복이 없기 때문에 여러 개의 catch 블록이 있는 프로그램보다 작습니다 .

참고 : catch 블록이 둘 이상의 예외 유형을 처리하는 경우 catch 매개변수는 암시적으로 final 입니다 . 이 예에서 catch 매개 변수 ex는 최종 변수 이므로 catch 블록 내에서 값을 할당할 수 없습니다 .

이 접근법은 일반적으로 여러 예외를 포착하고 비슷한 코드를 가지고 있는 경우에 사용됩니다. 하지만 우리가 원하는 대로 사용할 수도 있습니다.

예 2

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (ArithmeticException|ArrayIndexOutOfBoundsException e) {
      if (e instanceof ArithmeticException)
          System.out.println("ArithmeticException");
      else
          System.out.println("ArrayIndexOutOfBoundsException");
    }
  }
}

단일 catch 블록에서 여러 예외를 catch하는 경우 규칙이 일반화되어 특수화됩니다.

즉, catch 블록에 예외 계층이 있는 경우 여러 특수 예외를 잡는 대신 기본 예외만 잡을 수 있습니다.

예를 들어 보겠습니다.

예제 1: 기본 예외 클래스만 잡기

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

/ by zero

기본 예외 클래스가 catch 블록 에 이미 지정된 경우 동일한 catch 블록에서 자식 예외 클래스를 사용하지 마십시오. 그렇지 않으면 컴파일 오류가 발생합니다.

예를 들어 보겠습니다.

예제 2: 기본 및 자식 예외 클래스 잡기

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing

프로그램

경우에 따라 단일 코드 조각에서 둘 이상의 예외가 발생할 수 있습니다. 이러한 유형의 상황을 처리하려면 각각 다른 유형의 예외를 포착하는 두 개 이상의 catch 절을 지정할 수 있습니다. 예외가 발생하면 각 catch 문을 순서대로 검사하여 예외와 유형이 일치하는 첫 번째 catch 문을 실행합니다. 하나의 catch 문이 실행된 후 다른 문은 무시되고 try/catch 블록 다음에 실행이 계속됩니다. 다음 예제에서는 두 가지 다른 예외 유형을 트래핑합니다.

// Demonstrate multiple catch statements.
class MultiCatch {
public static void main(String args[]) {
try {
    int a = args.length;
    System.out.println("a = " + a);
    int b = 42 / a;
    int c[] = { 1 };
    c[42] = 99;
} catch(ArithmeticException e) {
    System.out.println("Divide by 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
    System.out.println("Array index oob: " + e);
}
System.out.println("After try/catch blocks.");
}
}

다음은 두 가지 방법으로 실행하여 생성된 출력입니다.

C:\>java MultiCatch
a = 0
Divide by 0: java.lang.ArithmeticException: / by zero
After try/catch blocks.
C:\>java MultiCatch TestArg
a = 1
Array index oob: java.lang.ArrayIndexOutOfBoundsException:42
After try/catch blocks.

/* This program contains an error.
A subclass must come before its superclass in
a series of catch statements. If not,
unreachable code will be created and a
compile-time error will result.
*/
class SuperSubCatch {
public static void main(String args[]) {
    try {
        int a = 0;
        int b = 42 / a;
    } catch(Exception e) {
        System.out.println("Generic Exception catch.");
    }
    /* This catch is never reached because
    ArithmeticException is a subclass of Exception. */
    catch(ArithmeticException e) { // ERROR - unreachable
        System.out.println("This is never reached.");
    }
}
}

Mouad Oumous Java WhatsApp 그룹에 가입하세요 .

Mouad Oumous 텔레그램 채널 가입 JOIN

세마포어 | Java 동시 API Java 동시 API 패키지 — 1부 Java — 8 | 예제가 포함된 BiFunction, BiConsumer 및 BiPredicate 인터페이스