Java에서 비정상적으로 처리된try와catch 코드 블록 사용

5722 단어 Java이상
Java try 및catch 사용
Java가 실행될 때 시스템이 제공하는 기본 이상 처리 프로그램은 디버깅에 매우 유용하지만, 보통 이상을 처리하기를 원합니다.이렇게 하면 두 가지 좋은 점이 있다.첫째, 그것은 네가 잘못을 수정할 수 있도록 허락한다.둘째, 프로그램이 자동으로 종료되는 것을 방지한다.대부분의 사용자들은 프로그램이 실행을 중지하고 언제 오류가 발생하든지 창고 궤적을 인쇄하는 것에 대해 매우 괴로워한다. (적어도 이렇게 말할 수 있다.)다행히도 이것은 피하기 쉽다.
실행 중 오류를 방지하고 처리하기 위해서, 당신이 감시할 코드를try 블록에 넣으면 됩니다.try 블록을 따라가면 포획하고 싶은 오류 형식을 설명하는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 블록으로 영원히 되돌아오지 않습니다.따라서 "This will not be printed."
표시되지 않습니다.일단catch 문장을 실행하면 프로그램 제어는 전체try/catch 메커니즘의 다음 줄에서 계속됩니다.
try와catch 문장이 하나의 단원을 형성했다.catch 자구의 범위는try 문장 앞에 정의된 문장에 제한됩니다.하나의catch문장은 다른try성명이 일으키는 이상을 포착할 수 없습니다. (끼워넣은try문장이 아니라면)
try로 보호된 문장 성명은 반드시 하나의 대괄호 안에 있어야 한다.너는 단독으로try를 사용할 수 없다.
캐치 서브문장을 구성하는 목적은 이상 상황을 해결하고 오류가 발생하지 않은 것처럼 계속 실행하는 것이다.예를 들어 다음 프로그램에서 모든 for 순환의 반복은 두 개의 무작위 정수를 얻는다.이 두 정수는 각각 상대방에게 제거되었는데, 결과는 12345를 제거하는 데 쓰였다.마지막 결과는 a에 존재한다.만약 나눗셈 작업이 제로 오류를 초래한다면, 이것은 포착되고, 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 해석기에서 실행되며, 각각의 오류는 다음 메시지를 표시합니다.

  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.");
  }
}
이 프로그램은 명령행 매개 변수가 없는 시작 조건에서 실행되어 0에서 이상을 제거합니다. 왜냐하면 a는 0이기 때문입니다.만약 명령행 파라미터를 제공한다면, 이것은 다행히 어려움을 면할 것입니다. a를 0보다 큰 수치로 설정합니다.그러나 이것은 Array Index Out Of Bounds Exception 이상을 초래할 것입니다. 정형수 그룹 c의 길이가 1이기 때문에 프로그램은 c[42]에 값을 부여하려고 합니다.
다음은 두 가지 다른 상황에서 실행되는 프로그램의 출력입니다.

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 문장은 Exception에 대한 모든 오류를 처리합니다. ArithmeticException을 포함합니다.이것은 두 번째catch 문장이 영원히 실행되지 않는다는 것을 의미한다.프로그램을 수정하기 위해 두 개의catch 문장의 순서를 뒤바꿉니다.

좋은 웹페이지 즐겨찾기