Java의 다양한 비정상 처리 방식을 깊이 있게 분석하다

4863 단어 Java이상 처리
1. 디버그 추적 코드:

  public static void enterTryMethod() { 
    System.out.println("enter after try field"); 
  } 
   
  public static void enterExceptionMethod() { 
    System.out.println("enter catch field"); 
  } 
   
  public static void enterFinallyMethod() { 
    System.out.println("enter finally method"); 
  } 

2. Exception을 던지고finally가 없으면catch가return을 만나면
   

public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 0; //  Exception,  
      enterTryMethod(); 
      return res; // Exception ,  
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1;  // Exception ,  
    } 
  } 
백그라운드 출력 결과:

  enter catch field 
  1 

3. Exception을 던져서catch체에return이 있으면finally체의 코드 블록은catch가return을 실행하기 전에 실행됩니다
   

public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 0; //  Exception,  
      enterTryMethod(); 
      return res; // Exception ,  
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1;  // Exception ,  
    } finally { 
      enterFinallyMethod(); // Exception ,finally catch return  
    } 
  } 
백그라운드 출력 결과:

  enter catch field 
  enter finally method 
  1 

4. Exception을 던지지 않고,finally 코드 블록에서return을 만나면,finally가 실행되면 모든 방법을 끝냅니다.

  public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 2; //  Exception 
      enterTryMethod(); 
      return res; //  , finally  
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; 
    } finally { 
      enterFinallyMethod(); 
      return 1000; // finally return , return , try catch ,  
    } 
  } 

백그라운드 출력 결과:

  enter after try field 
  enter finally method 
  1000 

5. Exception을 버리지 않고finally 코드 블록에서 System을 만납니다.exit () 방법은 방법이 아니라 전체 프로그램을 종료하고 종료합니다.
 

  public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 2; //  Exception 
      enterTryMethod(); 
      return res; //  , finally ,  
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; 
    } finally { 
      enterFinallyMethod(); 
      System.exit(0); // finally System.exit() ,System.exit() ,  
    } 
  } 
백그라운드 출력 결과:

  enter after try field 
  enter finally method 

6. Exception을 던져서catch와finally가 동시에 Return을 만나면catch의return 반환값은 되돌아오지 않습니다.finally의return 문장은 모든 방법을 끝내고 되돌아옵니다.
   

 public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 0; //  Exception,  
      enterTryMethod(); 
      return res; // Exception ,  
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; // Exception , , finally  
    } finally { 
      enterFinallyMethod(); 
      return 10; // return , 10 
    } 
  } 
백그라운드 출력 결과:

  enter catch field 
  enter finally method 
  10 

7. Exception을 던지지 않고,finally가return을 만나면try의return반환값은 되돌아오지 않습니다.finally의return문장은 모든 방법을 끝내고 되돌아옵니다.
   

 public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 2; //  Exception 
      enterTryMethod(); 
      return res; //  , finally  
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; 
    } finally { 
      enterFinallyMethod(); 
      return 10; // return , 10 
    } 
  } 
백그라운드 출력 결과:

  enter after try field 
  enter finally method 
  10 

결론
자바의 이상 처리에서 프로그램이 try 안의 코드 블록을 실행한 후에 이 방법은 즉각 끝나지 않고 이 방법에finally 코드 블록이 있는지 계속 찾으려고 합니다
만약finally 코드 블록이 없다면, 모든 방법은try 코드 블록을 실행한 후에 상응하는 값을 되돌려 모든 방법을 끝냅니다.
만약finally 코드 블록이 있다면, 프로그램은try 코드 블록에 있는return 한마디를 실행할 때 return을 즉시 실행하지 않고, 먼저finally 코드 블록에 있는 코드를 실행합니다
만약finally 코드 블록에return이 없거나 프로그램을 종료할 수 있는 코드가 없다면, 프로그램은finally 코드 블록 코드를 실행한 후try 코드 블록에return 문장을 실행하여 모든 방법을 끝냅니다.만약finally 코드 블록에return이 있거나 프로그램을 종료할 수 있는 코드가 포함되어 있다면, 방법은finally를 실행한 후에 끝나고try 코드 블록으로 되돌아와return을 실행하지 않습니다
이상을 던지는 상황에서도 원리는 위와 같다. 위에서 말한 try를catch로 바꾸어 이해하면 된다.

좋은 웹페이지 즐겨찾기