Java에서 포착되지 않은 이상 및 try 문장의 중첩 사용 분석

5166 단어 Java
Java 캡처되지 않은 예외
프로그램에서 이상을 처리하는 것을 배우기 전에 그것을 처리하지 않으면 어떤 상황이 일어날지 보는 것이 좋다.아래의 작은 프로그램은 고의로 오류를 없애는 표현식을 포함한다.

class Exc0 {
  public static void main(String args[]) {
    int d = 0;
    int a = 42 / d;
  }
}
자바가 실행될 때 시스템은 0이 제거된 상황을 검사하고 새로운 이상 대상을 구성하여 이 이상을 던진다.이것은 exc0의 실행을 멈추게 합니다. 이상이 던져지면 이상 처리 프로그램에 포착되어 즉시 처리되어야 하기 때문입니다.이 예에서 우리는 우리만의 이상 처리 프로그램을 제공하지 않았기 때문에 이상은 자바가 실행될 때 시스템의 기본 처리 프로그램에 포착되었다.프로그램에 포착되지 않은 이상은 결국 기본 처리 프로그램에 의해 처리됩니다.기본 프로세서는 이상이 발생한 곳의 창고 궤적을 인쇄하고 프로그램을 종료하는 이상한 문자열을 보여 줍니다.
다음은 표준 javaJDK가 실행될 때 이 프로그램을 실행하는 데 발생하는 출력입니다.

  java.lang.ArithmeticException: / by zero
  at Exc0.main(Exc0.java:4)
클래스 이름 Exc0, 메서드 이름 main, 파일 이름 Exc0.자바와 줄 수 4는 어떻게 간단한 창고 사용 궤적에 포함됩니까?그리고 던진 이상 유형은 Exception의 Arithmetic Exception이라는 하위 클래스입니다. 이 하위 클래스는 어떤 유형의 오류 방법을 명확하게 설명합니다.이 장의 뒷부분에서는 Java가 발생할 수 있는 여러 종류의 실행 중 오류와 일치하는 여러 종류의 이상 유형을 제공합니다.
스택 궤적은 오류가 발생하는 방법 호출 시퀀스를 표시합니다.예를 들어 다음은 이전 프로그램의 다른 버전입니다. 같은 오류를 소개했지만 main () 방법 이외의 다른 방법에서 오류가 발생했습니다.

class Exc1 {
  static void subroutine() {
    int d = 0;
    int a = 10 / d;
  }
  public static void main(String args[]) {
    Exc1.subroutine();
  }
}
기본 비정상 프로세서의 스택 경로 결과는 전체 호출 스택이 어떻게 표시되는지 나타냅니다.

  java.lang.ArithmeticException: / by zero
  at Exc1.subroutine(Exc1.java:4)
  at Exc1.main(Exc1.java:7)
보시다시피 창고 밑은main의 일곱 번째 줄입니다. 이 줄은subroutine () 방법을 사용합니다.이 방법은 네 번째 줄에서 이상을 초래했다.창고를 호출하는 것은 디버깅에 있어서 매우 중요하다. 왜냐하면 그것은 오류를 초래하는 정확한 절차를 규명했기 때문이다.
Java try 문장의 중첩
Try 문구는 중첩될 수 있습니다.즉, 하나의try문구는 다른try블록 내부에 있을 수 있다.매번 try 문장에 들어갈 때마다 이상한 전후 관계는 창고로 밀려든다.내부의try문장에 특수한 이상의catch프로세서가 없으면 창고가 팝업되고 다음try문장의catch프로세서가 일치하는지 확인합니다.이 과정은catch 문장이 일치할 때까지, 또는 모든 플러그인try 문장이 검사될 때까지 계속될 것입니다.catch 문장이 일치하지 않으면 자바의 실행 시 시스템이 이 이상을 처리합니다.다음은 중첩된 try 문장을 활용한 예입니다.

// An example of nested try statements.
class NestTry {
  public static void main(String args[]) {
    try {
      int a = args.length;
      /* If no command-line args are present,the following statement will generate a divide-by-zero exception. */
      int b = 42 / a;
      System.out.println("a = " + a);
      try { // nested try block
        /* If one command-line arg is used,then a divide-by-zero exception will be generated by the following code. */
        if(a==1) a = a/(a-a); // division by zero
        /* If two command-line args are used,then generate an out-of-bounds exception. */
        if(a==2) {
          int c[] = { 1 };
          c[42] = 99; // generate an out-of-bounds exception
        }
      } catch(ArrayIndexOutOfBoundsException e) {
        System.out.println("Array index out-of-bounds: " + e);
      }
    } catch(ArithmeticException e) {
      System.out.println("Divide by 0: " + e);
    }
  }
}
보시다시피, 이 프로그램은 하나의try 블록에 다른try 블록을 끼워 넣었습니다.프로그램 작업은 다음과 같습니다. 명령행 매개 변수가 없는 상황에서 이 프로그램을 실행하면 바깥의try 블록에 0이 제거된 이상이 발생합니다.프로그램은 명령행 매개 변수 조건에서 실행되며, 중첩된try 블록에서 제로 제거된 오류가 발생합니다.내부의 블록이 이 이상과 일치하지 않기 때문에, 이상을 외부의try 블록에 전달하고, 그곳에서 이상이 처리됩니다.만약 두 개의 명령행 매개 변수가 있는 조건에서 이 프로그램을 실행한다면, 내부try 블록에서 그룹 경계 이상이 발생합니다.다음 결과는 각 상황에 대해 설명합니다.

C:\>java NestTry
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One
a = 1
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One Two
a = 2
Array index out-of-bounds: java.lang.ArrayIndexOutOfBoundsException
방법이 호출될 때try문장의 끼워넣기는 매우 은밀하게 발생할 수 있다.예를 들어, 방법에 대한 호출을try 블록에 넣을 수 있습니다.이 방법 내부에는 또 다른try문구가 있다.이런 상황에서 방법 내부의try는 외부에서 이 방법을 호출하는try 블록에 끼워져 있다.다음은 앞의 예에서 수정한 것입니다. 중첩된 try 블록이 방법 nesttry () 의 내부로 옮겨졌습니다.

/* Try statements can be implicitly nested via calls to methods. */
class MethNestTry {
  static void nesttry(int a) {
    try { // nested try block
      /* If one command-line arg is used,then a divide-by-zero exception will be generated by the following code. */
      if(a==1) a = a/(a-a); // division by zero
      /* If two command-line args are used,then generate an out-of-bounds exception. */
      if(a==2) {
        int c[] = { 1 };
        c[42] = 99; // generate an out-of-bounds exception
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Array index out-of-bounds: " + e);
    }
  }

  public static void main(String args[]) {
    try {
      int a = args.length;
      /* If no command-line args are present,the following statement will generate a divide-by-zero exception. */
      int b = 42 / a;
      System.out.println("a = " + a);
      nesttry(a);
    } catch(ArithmeticException e) {
      System.out.println("Divide by 0: " + e);
    }
  }
}

이 프로그램의 출력은 앞의 예와 같다.

좋은 웹페이지 즐겨찾기