java uncught 예외 <br /> 프로그램의 예외를 처리하는 법을 배우기 전에, 당신이 그들을 다루지 않으면 어떤 일이 일어나는지 보는 것이 좋습니다. 다음 애플릿에는 의도적으로 구분되지 않은 오류를 유발하는 표현식이 포함되어 있습니다.
클래스 exc0 {public static void main (String args []) {int d = 0;
Java 런타임 시스템이 0으로 나눈 상황을 확인하면 새로운 예외 객체를 구성하고 예외를 던집니다. 예외가 발생하면 예외 핸들러에 의해 잡히고 즉시 처리되어야하기 때문에 ADC0의 실행이 중지됩니다. 이 예에서는 자체 예외 핸들러를 제공하지 않으므로 Java 런타임 시스템의 기본 핸들러에 의해 예외가 발생합니다. 프로그램에 의해 잡히지 않은 예외는 결국 기본 핸들러에 의해 처리됩니다. 기본 핸들러는 예외를 설명하는 문자열을 표시하고 예외가 발생하는 스택 추적을 인쇄하고 프로그램을 종료합니다.
다음은 프로그램을 실행하기 위해 표준 Javajdk 런타임 통역사가 생성 한 출력입니다.
java.lang.arithmeticexception : / exc0.main에서 Zero (exc0.java:4)
클래스 이름 Exc0, 메소드 이름 메인, 파일 이름 ack0.java 및 줄 번호 4가 간단한 스택 사용 트랙에 포함되는 방법에 유의하십시오. 또한 제외 된 예외 유형은 ArithMeticeXception이라는 예외의 서브 클래스이며 어떤 유형의 오류 메소드를 더 명확하게 설명합니다. 이 장의 뒷부분에서 Java는 생성 될 수있는 다양한 유형의 런타임 오류와 일치하는 여러 내장 예외 유형을 제공합니다.
스택 트랙은 메소드 호출 시퀀스를 표시하여 오류가 발생합니다. 예를 들어, 여기에 동일한 오류를 도입하는 이전 프로그램의 다른 버전이 있지만 메인 () 메소드 이외의 다른 메소드에서 오류가 생성됩니다.
클래스 exc1 {정적 void subroutine () {int d = 0;
기본 예외 핸들러의 스택 트랙 결과는 전체 통화 스택이 표시되는 방법을 보여줍니다.
java.lang.arithmeticexception : / exc1.subroutine (exc1.java:4)에서 exc1.main (exc1.java:7)
보시다시피, 스택의 바닥은 Subroutine () 메소드를 호출하는 Main의 7 행입니다. 이 방법은 4 행에서 예외를 유발합니다. 통화 스택은 오류로 이어지는 정확한 단계를 정확히 파악하기 때문에 디버깅에 중요합니다.
자바 시도 진술의 중첩
시도 진술은 중첩 될 수 있습니다. 즉, 시도 문은 다른 시도 블록 내부에있을 수 있습니다. Try 문을 입력 할 때마다 관계는 스택으로 밀려납니다. 내부 시도 명령문에 특별한 예외가있는 캐치 핸들러가 포함되어 있지 않으면 스택이 나타나고 다음 시도 문의 캐치 핸들러가 일치하는지 확인합니다. 이 프로세스는 캐치 명령문이 성공적으로 일치하거나 중첩 된 모든 시도 명세서가 소진 될 때까지 계속됩니다. 캐치 문이 일치하지 않으면 Java 런타임 시스템 이이 예외를 처리합니다. 다음은 중첩 시도 진술을 사용하는 예입니다.
// 중첩 된 시도의 예. 클래스 네스트 트리 {public static void main (String args []) {try {int a = args.length가없는 경우; Divide -By-Zero 예외 * / int b = 42 / a; "a =" + A); Divide -By-Zero 예외는 다음 코드로 생성됩니다. */if (a == 1) a = a // 두 명령이 사용되는 경우; ou t-of-bounds 예외 e) {system.out.println ( " + e)} catch (arithmeticexception e) {" + e);
보시다시피, 프로그램은 한 번의 시도 블록에서 또 다른 시도 블록을 중첩시킵니다. 이 프로그램은 다음과 같이 작동합니다. 명령 줄 매개 변수없이 프로그램을 실행할 때 외부 시도 블록은 예외를 0으로 나눈 값을 생성합니다. 이 프로그램은 명령 줄 매개 변수 조건에 따라 실행되며 오류는 중첩시 시도 블록으로 나눈 값으로 나뉘어 진 오류가 발생합니다. 내부 블록 이이 예외와 일치하지 않기 때문에 예외가 처리되는 외부 시도 블록으로 예외를 전달합니다. 두 개의 명령 줄 매개 변수로 프로그램을 실행하면 내부 시도 블록에서 배열 경계 예외가 생성됩니다. 다음 결과는 각 사례를 보여줍니다.
C :/> Java NesttryDivide by 0 : java.lang.arithmeticexception :/zeroc :/> java nesttry onea = 1divide by 0 : java.lang.arithmeticexception :/> java nesttry One Twoa = 2array index out- 바운드 : java.lang.arrayindexoutofboundsexception
메소드 호출이 있으면 시도 문의 중첩은 매우 비밀리에 발생할 수 있습니다. 예를 들어, 시도 블록에 메소드를 호출 할 수 있습니다. 이 방법에는 또 다른 시도 문이 있습니다. 이 경우, 메소드 내부의 시도는 여전히 메소드를 외부로 호출하는 시도 블록에 중첩되어 있습니다. 다음은 이전 예제의 수정이며 중첩 트리 블록은 Method Nesttry () 내부로 이동됩니다.
/* 시도는 메소드를 통한 호출을 통해 암시 적으로 중첩 될 수 있습니다.* /class methnestry {int a) {try {// 하나의 com mand-line arg가 사용되는 경우 divide-by. -예외는 다음 코드에 의해 생성됩니다. */if (a == 1) a = a/(aa). f- 경계 예외. */ if (a == 2) {int c [] = {1}; .out .println ( " + e)} 공개 정적 무효 메인 (string args []) {int a = args.length; 전송 된 진술은 제로별로 생성됩니다 ) {system. out.println ( " + e}}};
이 프로그램의 출력은 이전 예에서와 동일합니다.