"자바 가상 머신에 대한 심층 이해"- JVM 방법 예외 처리

A, 자바 이상

프로그램에서 프로그래머 오류는 존재하지 않는 파일을 열려고 시도하는 등, 예를 들어, 잘못된 데이터 사용자의 예기치 못한 상황이나 프로그래머의 제어 범위를 벗어난 환경에서 발생할 수 있습니다. 시의 적절하고 효과적인 프로그램에서 런타임 오류를 처리 할 수 ​​있도록하기 위해, 자바는 특별한 예외 클래스를 소개합니다.

두 자바 일반적인 예외 카테고리

셋째, 왜 예외

예외는 주로 다음과 같은 세 가지 이유에서, 자바에서 생성됩니다

  1. 예외 예외는, Java 가상 머신 자바는 내부 오류를 생성합니다.
  2. 에러 작성된 비정상적인 프로그램 코드는 예를 들어, 널 포인터 예외 비정상적인 배열 범위를 생성. 이 이상은 선택하지 않은 비정상적인라고하며, 일반적으로 어떤 수업을 처리하는 데 초점을 맞출 필요가있다.
  3. 수동 throw 문 이상에 의해 생성 된 이러한 이상은 일반적으로 필요한 정보의 메소드의 호출을 알리는 데 사용 이상 검사를했다.

넷째, 어떻게 이상이 발생합니까?

우리는 예외 객체를 생성하고 던져 (던져) 예외라고 런타임 시스템에 제출. 당신이 캡처 (캐치) 예외로 알려져있는 과정이다 오브젝트의 유형을 찾을 때까지이 시스템은 런타임 호출 스택 방법에서 예외를 처리 할 수 ​​보인다.

Java 예외가 프로그램의 견고성과 보안을 고려하는 사용자를 강제로. 예외 처리는 프로그램의 정상적인 흐름을 제어하는데 사용되지 않으며, 그것의 주요 역할은 프로그램 예외 동작과 대응하는 처리 동안 발생 캡처한다. 예외에게 발생할 수있는 방법을 처리하는 코드를 작성, 우리는 다음과 같은 세 가지 원칙을 따를 수 있습니다 :

  1. 예외를 잡기 위해 현재 메소드 선언의 try catch 문에 사용됩니다.
  2. 방법은 그것을 덮는 피복하면 동일한 방법 예외 또는 서브 예외를 발생한다.
  3. 부모 클래스보다 예외를 throw하면, 재정의 방법은 특별한 사람들의 부분 집합을 던져해야하지만, 새로운 예외를 던질 수 없습니다.

(참조 : HTTP : //c.biancheng.net/view/1038.html)

다섯째, JVM 관점 비정상적인 발현 생성

 샘플 코드를보고 :

공공  클래스 푸 {
   개인  INT의 tryBlock;
  개인  INT의 catchBlock;
  개인  INT의 finallyBlock;
  개인  INT의 methodExit; 


  공공  무효 시험 () {
     시도 { 
      tryBlock = 0 ; 
    } 캐치 (예외 E) { 
      catchBlock = 1 ; 
    } 마지막 { 
      finallyBlock = 2 ; 
    } 
    methodExit = 3 ; 
  } 
}

이 코드는 예외 처리 코드의 간단한 조각, 우리는은 javap로 클래스 파일의 형태로 표현을 볼 수있다 :

공개  공극 시험 (); 
    디스크립터 () V의 
    플래그 : ACC_PUBLIC 
    번호 : 
      스택 = 2, 지역 주민 = 3 args_size = 1 
         0 : aload_0
          1 : iconst_0
          2 : putfield 2                   // 필드 tryBlock : I 
         5 : aload_0
          6 : iconst_2
          7 : putfield # 3                   / / 필드 finallyBlock : I가 
        10 : 고토           35 
        13 : astore_1
         14 : aload_0
         15 : iconst_1
        16 : putfield # 5                   // 필드 catchBlock : I 
        (19) : aload_0
         20 : iconst_2
         21 : putfield # 3                   // 필드 finallyBlock : I 
        (24) : 고토           35 
        27 : astore_2
         28 : aload_0
         29 : iconst_2
         30 : putfield # 3                   // 필드 finallyBlock : I는 
        33 : aload_2
         34 : athrow
         35 : aload_0
         36 : iconst_3
        37 : putfield # 6                   // 필드 methodExit : I 
        40 : 복귀 
      예외 테이블 : 
         유형을 타겟팅에서
              0~5 13 클래스 자바 / 랭 / 예외
              0~5 27    어떤
             13 19 27    임의 
      LineNumberTable : 
        라인 10 : 0 
        라인 14 : 5  15 10  11 : 13  12 : 14  14 : 19  15 : 24  14 : 27  16 : 35
        라인 17 : 40 
      StackMapTable : number_of_entries = 3 
        frame_type = 77 / * same_locals_1_stack_item * / 
          스택 = 클래스 자바 / LANG / 예외] 
        frame_type = 77 / * same_locals_1_stack_item * / 
          스택 = 클래스 자바 / LANG / Throwable를] 
        frame_type = 7 / * 동일한 * /

바이트 코드는 주석에서 볼 수있는 마지막 블록은 세 곳이 추가됩니다. JVM 마침내 논리 블록 및 시도하는 catch 블록에서 블록 생성 된 바이트 코드 파일에 자바 코드에서 변환 할 때 즉,. 그러나 "결국"왜 세, 그것에 대해 그것을 생각? 캐치 블록의 코드를 실행하는 동안 마지막으로 제조 마지막 예외가 발생했습니다. 코드가 그것을 어떻게 finally 블록에 오류가있는 경우 그래서, 하나 요청할 수 있습니다? 여기에, 아니 사실의 도입은 자신을 입증한다 :, 처리하는 코드 층을 던져 질 수 있습니다.

여기서, 바이트 코드의 황색 부분 설명 :

비정상 관련된 모든 코드를 기억하는 이상, 예외 테이블을 나타내는 예외 테이블에 나타난 각 클래스를 컴파일 후에 예외가 발생하면, 대응하는 행 (예외 테이블에서 제 즉, 각 태그를 보이는 예외 테이블 따를  try{}catch(){}발견하는 경우 등) 마지막으로 반환 후 (다음, 발견, 부모의 이상 사본에 부모 테이블을 조회 할 호출 한 후 전화를 적용, 그렇지 않은 경우 코드 블록), 실행, 예외 핸들러로 이동 .

...로부터 다음과 예외 핸들러의 범위를 나타내는 모니터 (예를 들면 코드를 포함하는 블록을 시도)

타겟 : 예외 핸들러 (예컨대 캐치 블록 코드를 포함)를 시작 위치를 나타낸다

입력 : 그것은 예외 처리이다

예외가 발생한 후 그 다음, 어떻게 예외 테이블을 통제하기 위해?

프로그램 상단에서 테이블의 바닥 통과 비정상적인 항목에 대한 예외, 자바 가상 머신을 트리거합니다. 인덱스 값의 바이트 코드가 예외 테이블 항목을 모니터링의 범위 내에서 예외를 트리거 할 때 이상 경기는, Java 가상 기회가 발생 예외 및 캡처 할 항목을 판단합니다. 경기는, Java 가상 머신이 코드 입력 포인터의 대상 흐름을 제어 할 경우 프로그램이 계속 실행됩니다.

바이트 코드 예외 테이블에 대한 분석, 아래에 언급 :

시작 프로그램은, (1)에 실행 : iconst_0 예외 예외가 발생 후, 프로그램은 첫 번째 행에서, 편리한 방법 테이블로 가서 검출 0 <A <5, 검출 범위가 첫 번째 엔트리에 대응하고, 다시 발생 확인 바이트 코드 번호 (13)에 점프가 계속 실행 후 이상이 예외는, 항목, 캡처 된 예외 처리를 일치합니다. 예외가 aload_0 발생하고 프로그램이 예외 테이블로 이동하는 경우, 특별한 항목이 일치를 찾아, 최종 목표는 바이트 코드 (27)의 일련 번호를 찾을 수 있습니다, 그것은 바이트 코드에 이르기까지 모두 완료 : 14 개에합니다.

소속 이상로서는 캐치 블록, 그것의 슬로우 athrow 바이트 코드, 후의 단계가 알 수 일어난다.

 

음, JVM은이 예외를 참조하십시오.

(인용 : 괴짜 시간)

추천

출처www.cnblogs.com/chenscript/p/11391690.html