Java 언어에서 오류 클래스의 기본 클래스는 java.lang.error이며 예외 클래스의 기본 클래스는 java.lang.exception입니다.
1) 유사성 : java.lang.error 및 java.lang.exception은 모두 java.lang.throwable의 서브 클래스입니다. 그래서 java.lang.error 및 java.lang.exception 자체 및 하위 클래스는 다음과 같은과 같은 대상으로 사용할 수 있습니다. 그리고 새로운 myException ()을 던지십시오. 여기서 MyError 클래스는 java.lang.error의 서브 클래스이고 MyException 클래스는 java.lang.exception의 서브 클래스입니다.
2) 차이점 : java.lang.error 자체와 하위 클래스는 Try-Catch 문의 지원을 요구하지 않습니다. 이 메소드는 다음 방법으로 정의 된대로 언제든지 반환 할 수 있습니다.
public String myMethod () {Throw New MyError (); } 여기서 myerror 클래스는 java.lang.error 클래스의 서브 클래스입니다.
java.lang.exception 자체와 하위 클래스는 Try-Catch 문의 지원이 필요하며 다음 방법 정의는 잘못되었습니다.
public string myMethod () {Throw New MyException (); }올바른 방법은 다음과 같이 정의됩니다.
public string myMethod ()는 myException {Throw New MyException (); }여기서 MyException 클래스는 java.lang.exception의 서브 클래스입니다.
Java Exception은 Java 프로그램이 실행될 때 비정상적인 상황이 발생할 때 생성 된 객체입니다. 예외 정보를 캡슐화합니다. Java 예외의 루트 클래스는 java.lang.throwable입니다. 전체 클래스에는 두 개의 직접 서브 클래스 java.lang.error와 java.lang.exception.error는 프로그램 자체에서 복구 할 수없는 심각한 오류입니다. 예외는 프로그램에서 잡고 처리 할 수있는 예외 오류를 나타냅니다. JVM은 메소드 콜 스택을 사용하여 각 스레드에서 일련의 메소드 호출 프로세스를 추적하여 각 호출 방법의 로컬 정보를 저장합니다. 독립적 인 Java 프로그램의 경우 프로그램의 주요 방법에 이르기까지 할 수 있습니다. 새 방법이 호출되면 JVM은 스택 상단에 메소드를 설명하는 스택 구조를 배치하고 스택 상단의 메소드는 올바른 실행 방법입니다. AVA 메소드 후 J가 정상적으로 실행되면 JVM은 통화 스택에서 메소드의 스택 구조로 돌아온 다음 이전 메소드를 계속 처리합니다. 코드 실행 중에 Java 메소드가 예외를 던지면 JVM은 예외를 포착 할 수있는 캐치 블록 코드를 찾아야합니다. 먼저 현재 방법에 캐치 코드 블록이 있는지 확인하고 존재하는 경우 캐치 코드 블록을 실행합니다. 그렇지 않으면 JVM은 통화 스택에서 메소드의 스택 구조로 돌아가서 이전 방법에서 적절한 캐치 코드 블록을 계속 찾습니다. 마지막으로, JVM이 Main () 메소드를 쫓아 가면 Main () 메소드에 예외를 계속 던지고 여전히 예외 처리기의 코드 블록을 찾지 못하면 스레드가 비정상적으로 종료됩니다. 스레드가 기본 스레드 인 경우 응용 프로그램도 그에 따라 종료됩니다. 현재 JVM은 사용자에게 직접 예외를 던지고 원래 예외 정보는 사용자 터미널에서 볼 수 있습니다.
Java.lang. 이탈 가능한 소스 코드 분석
패키지 java.lang; java.io.*; / ** * * Throwable은 모든 오류 및 예외의 부모 클래스입니다. * 4 개의 생성자가 있습니다. * Throwable () * Throwable (String Message) * Throwable (Thringable) */ Public Class Throwable Pemple Serializedable {private static final long serialversionuid = -304268605568047285L; /*** 기본 코드는이 슬롯에서 스택 백 트레이스의 일부 표시를 저장합니다. */ 개인 과도 객체 백 트레이스; / ***이 예외를 설명하는 정보*/ 개인 문자열 세부 사항; / *** 현재 예외는 throwable에 의해 야기되었음을 나타냅니다* null은 예외가 다른 던지기 가능에 의해 발생하지 않음을 의미한다면*이 개체 자체와 동일하다면 예외를 일으키는 객체가 초기화되지 않았 음을 나타냅니다*/ 개인 던지기 가능한 원인 = this; / *** 예외 트랙을 설명하는 배열*/ private stacktraceElement [] stacktrace; / *** 생성자, 원인 객체가 초기화되지 않은 초기화되지 않았다. } /*** 생성자* /public Throwable (문자열 메시지) {// 예외 트랙 배열 채우기 fillinstacktrace (); // 예외 설명 초기화 정보 정보 세부 사항 message = message; } / *** 생성자, 원인은 원인 객체를 나타냅니다* / public Throwable (문자열 메시지, 던질 가능한 원인) {fillInstackTrace (); DetailMessage = 메시지; 이 .cause = 원인; } / *** 생성자* / Public Throwable (Throwable Cause) {FillInstackTrace (); DetailMessage = (원인 == NULL? NULL : 원인 .toString ()); 이 .cause = 원인; } / *** 자세한 정보 가져 오기* / public string getMessage () {return detaildMessage; } / *** 자세한 정보 가져 오기* / public string getLocalizedMessage () {return getMessage (); } / *** 원인을 가져옵니다.* / public tashable getCause () {return (원인 == this? null : agains); } /*** 원인 객체를 초기화합니다. 이 방법은 초기화없이 한 번만 호출 할 수 있습니다*/ public synchronized trashcause (Throwable Cause) {// 초기화되지 않은 상태가 아닌 경우 (this.cause! = this) 새로운 불법 스테이트 렉스크 ( "오버 쓸 수 없음") 인 경우 예외를 던집니다. // 설정해야 할 원인 객체는 그 자체와 같으며 (원인 == this) 새로운 불법 법률을 던지면 예외를 던집니다 ( "selfausation n't 허용되지 않음"); // 원인 객체를 설정 this.cause = 원인; // 세트를 반환 원인 객체를 반환합니다. } / *** 문자열 표현* / public String toString () {String s = getClass (). getName (); 문자열 메시지 = getLocalizedMessage (); return (메시지! = null)? (s + ":" + 메시지) : s; } / *** 오류 트랙을 인쇄* / public void printStacktrace () {printStackTrace (System.err); } /*** 오류 트랙을 인쇄* /public void printstacktrace (printstream s) {synchronized (s) {// 현재 객체 S.println (this)의 toString 메소드를 호출합니다. // 예외 트랙을 가져옵니다. 배열 stacktraceElement [] trace = getOrstackTrace (); // (int i = 0; i <trace.length; i ++) s.println ( "/tat"+trace [i])에 대한 각 요소의 문자열 표현을 인쇄합니다. // 원인을 가져옵니다. // 원인 객체의 정보를 재귀 적으로 인쇄합니다. }} /*** 원인 객체 정보를 인쇄* @param s printed stream* @param cause exceper track이 객체로 인해 예외* /private void printstacktraceascause (printStream s, stackTraceElement [] CauseTrace) {// 현재 예외 트랙 stacktraceElement [] trace = getourstacktrace (); // m은 현재 예외 트랙 배열의 마지막 요소이며, // n은 현재 객체 int m = trace.length-1, n = againStrace.length-1로 인한 예외의 예외 트랙 배열의 마지막 요소입니다. // 두 배열 뒤에서 각각 루프. 그것이 동일하다면, 불평등 또는 배열이 시작에 도달 할 때까지 루프 (m> = 0 && n> = 0 && trace [m] .equals (caseTrace [n])) {m--; N--; } // 같은 숫자 int framesincommon = trace.length -1 -m; // 다른 오류 인쇄 S.println ( " + this로 발생합니다); for (int i = 0; i <= m; i ++) s.println ( "/tat"+trace [i]); // 숫자가 같은 경우 (framesincommon! = 0) s.println ( "/t ..." + framesincommon + "more") 인 경우 같은 숫자를 인쇄합니다. //이 객체의 원인을 가져 와서 정보를 재귀 적으로 던질 수있는 정보를 인쇄합니다. if (ourcause! = null) ourcause.printstacktraceascause (s, trace); } / *** 오류 트랙 인쇄* / public void printStacktrace (printWriter s) {synchronized (s) {s.println (this); stacktraceElement [] trace = getourstacktrace (); for (int i = 0; i <trace.length; i ++) s.println ( "/tat"+trace [i]); Throwable ourCause = getCause (); if (ourcause! = null) ourcause.printstacktraceascause (s, trace); }} / *** 원인 객체에 대한 정보를 인쇄* / private void printStackTraceAsCause (printWriter s, stackTraceElement [] CauseTrace) {// assert thread.holdslock (s); //이 사이에 공통적 인 프레임 수를 계산하고 stackTraceElement [] trace = getourstacktrace (); int m = trace.length-1, n = CauseTrace.length-1; while (m> = 0 && n> = 0 && trace [m] .equals (원인 [n])) {m-; N--; } int framesincommon = trace.length -1 -m; S.println ( " + this로 인한"; for (int i = 0; i <= m; i ++) s.println ( "/tat"+trace [i]); if (framesincommon! = 0) s.println ( "/t ..." + framesincommon + "more"); // 이유가있는 경우 rescurse wouncauses = getCause (); if (ourcause! = null) ourcause.printstacktraceascause (s, trace); } / *** 예외 트랙을 채우십시오* / public synchronized 기본 Throwable FillinStackTrace (); / *** 현재 예외 트랙의 사본을 반환*/ public stacktraceElement [] getStacktrace () {return (stackTraceElement []) getOrstackTrace (). clone (); } /** * 현재 예외 트랙을 가져옵니다 * /private synchronized stacktraceElement [] getourstacktrace () {//이 메소드가 처음으로 호출되면 예외 트랙 배열이 (stackTrace == null) if (stackTrace == null) {// 예외 트랙 int decth = getStacktracedepth ()를 가져옵니다. // 새로운 예외 트랙을 생성하고 채우고 stacktrace = new StackTraceElement [깊이]; for (int i = 0; i <깊이; i ++) stacktrace [i] = getStackTraceElement (i); // 지정된 비트 포인트의 예외 추적} return stacktrace; } /*** 예외 트랙 설정* /public void setStacktrace (stackTraceElement [] stackTrace) {// 설정 매개 변수 stackTraceElement [] defendenSiveCopy = (stackTraceElement []) stacktrace.clone (); // 설정 매개 변수에 빈 요소가 있으면 (int i = 0; i <defensivecopy.length; i ++) if (defensiveCopy [i] == null) throw nullpointerexception ( "stackTrace [" + i + "]"); // 현재 객체의 예외 추적을 설정 this.stacktrace = defensiveCopy; } / ** * 예외 트랙의 깊이는 0을 얻을 수 없음을 의미합니다. / *** 지정된 비트 포인트의 예외 트랙을 가져옵니다. 개인 동기화 된 void writeObject (java.io.objectOutputStream s)는 ioException {getOrstackTrace (); s.defaultWriteObject (); }}