> Java > java지도 시간 > Java에서 예외 처리를 위한 try 및 catch 코드 블록 사용

Java에서 예외 처리를 위한 try 및 catch 코드 블록 사용

高洛峰
풀어 주다: 2017-01-18 15:01:52
원래의
1631명이 탐색했습니다.

Java try and catch 사용
Java 런타임 시스템에서 제공하는 기본 예외 핸들러는 디버깅에 유용하지만 일반적으로 사용자는 예외를 직접 처리하려고 합니다. 여기에는 두 가지 이점이 있습니다. 첫째, 오류를 수정할 수 있습니다. 둘째, 프로그램이 자동으로 종료되는 것을 방지합니다. 대부분의 사용자는 프로그램이 종료될 때나 오류가 발생할 때마다 스택 추적이 인쇄되는 것에 짜증을 냅니다. 다행히도 이는 쉽게 피할 수 있습니다.

런타임 오류를 방지하고 처리하려면 모니터링하려는 코드를 try 블록에 넣으면 됩니다. try 블록 바로 뒤에 catch하려는 오류 유형을 지정하는 catch 절을 포함합니다. 이 작업을 수행하는 것은 간단합니다. 다음 프로그램에는 0으로 나누기로 인해 발생하는 ArithmeticException 예외를 처리하는 try 블록과 catch 절이 포함되어 있습니다.

class Exc2 {
  public static void main(String args[]) {
    int d, a;
    try { // monitor a block of code.
      d = 0;
      a = 42 / d;
      System.out.println("This will not be printed.");
    } catch (ArithmeticException e) { // catch divide-by-zero error
      System.out.println("Division by zero.");
    }
    System.out.println("After catch statement.");
  }
}
로그인 후 복사

프로그램 출력은 다음과 같습니다.

Division by zero.
After catch statement.
로그인 후 복사

try 블록의 println() 호출은 실행되지 않습니다. 예외가 발생하면 프로그램 제어가 try 블록에서 catch 블록으로 이전됩니다. 실행은 catch 블록에서 try 블록으로 "반환"되지 않습니다. 따라서 "인쇄되지 않습니다."

가 표시되지 않습니다. catch 문이 실행되면 전체 try/catch 메커니즘 아래 줄에서 프로그램 제어가 계속됩니다.

try와 해당 catch문이 하나의 단위를 형성합니다. catch 절의 범위는 try 문 앞에 정의된 문으로 제한됩니다. catch 문은 다른 try 문에서 발생한 예외를 포착할 수 없습니다(중첩된 try 문은 제외).

try로 보호되는 문 선언은 중괄호 안에 있어야 합니다(즉, 블록 안에 있어야 합니다). 시도만으로는 사용할 수 없습니다.

catch 절을 구성하는 목적은 예외를 해결하고 오류가 발생하지 않은 것처럼 계속 실행하는 것입니다. 예를 들어, 다음 프로그램에서 for 루프를 반복할 때마다 두 개의 임의의 정수가 생성됩니다. 이 두 정수를 서로 나누어서 그 결과를 사용하여 12345를 나눕니다. 최종 결과는 a에 저장됩니다. 나누기 연산으로 인해 0으로 나누기 오류가 발생하면 오류가 발견되고 a의 값이 0으로 설정되며 프로그램이 계속됩니다.

// Handle an exception and move on.
import java.util.Random;
 
class HandleError {
  public static void main(String args[]) {
    int a=0, b=0, c=0;
    Random r = new Random();
 
    for(int i=0; i<32000; i++) {
      try {
        b = r.nextInt();
        c = r.nextInt();
        a = 12345 / (b/c);
      } catch (ArithmeticException e) {
        System.out.println("Division by zero.");
        a = 0; // set a to zero and continue
      }
      System.out.println("a: " + a);
    }
  }
}
로그인 후 복사

예외 설명을 표시합니다.

Throwable은 toString() 메서드(Object로 정의됨)를 오버로드하므로 예외 설명이 포함된 문자열을 반환합니다. println()에 매개변수를 전달하여 예외에 대한 설명을 표시할 수 있습니다. 예를 들어, 이전 프로그램의 catch 블록은

catch (ArithmeticException e) {
  System.out.println("Exception: " + e);
  a = 0; // set a to zero and continue
}
로그인 후 복사

로 다시 작성될 수 있습니다. 이 버전이 원래 프로그램의 버전을 대체하고 프로그램이 표준 javaJDK 인터프리터에서 실행되면 모든 0으로 나누기 오류가 표시됩니다. 다음 메시지:

Exception: java.lang.ArithmeticException: / by zero
로그인 후 복사

컨텍스트에 특별한 값은 없지만 예외 설명을 표시하는 기능은 다른 상황, 특히 예외를 실험하고 디버깅할 때 유용할 수 있습니다.

Java 다중 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.");
  }
}
로그인 후 복사

명령줄 인수 없이 시작 조건에서 실행되는 프로그램은 a가 0이므로 0으로 나누기 예외가 발생합니다. 명령줄 인수를 제공하면 해당 인수는 유지되며 a를 0보다 큰 값으로 설정합니다. 그러나 정수 배열 c의 길이가 1이고 프로그램이 c[42]에 값을 할당하려고 하기 때문에 ArrayIndexOutOf BoundsException 예외가 발생합니다.

다음은 두 가지 다른 상황에서 프로그램을 실행한 결과입니다.

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 After try/catch blocks.
로그인 후 복사

여러 catch 문을 사용할 때 상위 클래스보다 먼저 예외 하위 클래스를 사용해야 한다는 점을 기억하는 것이 중요합니다. 의. 이는 상위 클래스의 catch 문을 사용하면 이 유형과 모든 하위 클래스의 예외를 포착하기 때문입니다. 이렇게 하면 하위 클래스가 상위 클래스보다 뒤에 있으면 하위 클래스가 절대 도착하지 않습니다. 게다가 Java에서 도달할 수 없는 코드는 버그입니다. 예를 들어, 다음 프로그램을 생각해 보세요.

/* 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 acompile-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.");
    }
  }
}
로그인 후 복사

이 프로그램을 컴파일하려고 하면 예외가 이미 포착되었기 때문에 두 번째 catch 문이 도착하지 않는다는 오류 메시지를 받게 됩니다. ArithmeticException은 Exception의 하위 클래스이기 때문에 첫 번째 catch 문은 ArithmeticException을 포함한 모든 예외 지향 오류를 처리합니다. 이는 두 번째 catch 문이 절대 실행되지 않음을 의미합니다. 프로그램을 수정하려면 두 catch 문의 순서를 반대로 바꾸세요.

Java의 예외 처리를 위한 try 및 catch 코드 블록 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿