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自体とそのサブクラスは、トリキャッチステートメントのサポートを必要としません。次の方法で定義されているように、この方法はいつでも返すことができます。
public string mymethod(){throw new myerror(); } MyErrorクラスはJava.lang.Errorクラスのサブクラスです。
java.lang.exception自体とそのサブクラスには、トライキャッチステートメントのサポートが必要であり、次のメソッド定義が間違っています。
public string mymethod(){throw new myexception(); }正しい方法は次のように定義されています。
public string myMethod()throws myException {throw new myexception(); }MyExceptionクラスはjava.lang.exceptionのサブクラスです。
Java例外は、Javaプログラムが実行されているときに異常な状況が発生したときに作成されたオブジェクトです。例外情報をカプセル化します。 Java例外のルートクラスはjava.lang.throwableです。クラス全体には、2つの直接サブクラスがありますjava.lang.errorとjava.lang.exception.errorは、プログラム自体では回復できない深刻なエラーです。例外は、プログラムによってキャッチおよび処理できる例外エラーを示します。 JVMは、メソッドコールスタックを使用して、各スレッドの一連のメソッド呼び出しプロセスを追跡し、各呼び出しメソッドのローカル情報を保存します。独立したJavaプログラムの場合、プログラムの主な方法までずっとできます。新しいメソッドが呼び出されると、JVMはスタックの上部にメソッドを記述するスタック構造を配置し、スタックの上部にあるメソッドは正しい実行方法です。 AVAメソッドが正常に実行された後にJが実行されると、JVMはコールスタックからメソッドのスタック構造に戻り、以前のメソッドの処理を続けます。 Javaメソッドがコードの実行中に例外をスローする場合、JVMは例外をキャッチできるCatchブロックコードを見つける必要があります。最初に、現在のメソッドにそのようなキャッチコードブロックがあるかどうか、およびそれが存在する場合、CACTEコードブロックを実行します。それ以外の場合、JVMはコールスタックのメソッドのスタック構造に戻り、前のメソッドで適切なキャッチコードブロックを見つけ続けます。最後に、JVMがMain()メソッドを追いかけている場合、つまり、Main()メソッドに例外を投げ続けていますが、例外ハンドラーのコードブロックが見つかりませんでしたが、スレッドは異常に終了します。スレッドがメインスレッドの場合、アプリケーションもそれに応じて終了します。この時点で、JVMは例外をユーザーに直接スローし、元の例外情報がユーザー端末に表示されます。
Java.lang.Throwableソースコード分析
パッケージjava.lang; java.io.*をインポートします。 / *** * *スロー可能なのは、すべてのエラーと例外の親クラスです。 * 4つのコンストラクターがあることに注意してください: * Throwable() * Throwable(String Message) * Throwable(Throwable Bause) * Throwable(String Message、Throwable Vause) */ Public Class Throwable Serializable {Private static Final Long Serialversionuid = -30426860556547285L; /***ネイティブコードは、このスロットのスタックバックトレースの表示を節約します。 */プライベートトランジェントオブジェクトバックトレース。 / ***この例外を説明する情報*/ private string deculationmessage; / ***現在の例外がスロー可能なものによって引き起こされることを示します* nullが例外が他のスローブルによって引き起こされないことを意味する場合*このオブジェクトがそれ自体と同じである場合、例外を原因とするオブジェクトが初期化されていないことを示します*/ private throwable原因= this; / ***例外トラックを説明する配列*/ private stacktraceElement [] stacktrace; / *** constructor、原因オブジェクトは初期化されませんinitase* fillinstacktraceを使用して、将来的に初期化できます。 } /*** constructor* /public throwable(string message){//例外トラックArray fillinstacktrace(); //例外の初期化説明情報詳細message = message; } / ***コンストラクター、原因は原因オブジェクトを表します* / public throwable(string message、throwable cause){fillinstacktrace(); detailmessage = message; this.caus = couse; } / *** Constructor* / public Throwable(Throwable bause){fillinstacktrace(); detailmessage =(cause == null?null:cause.toString()); this.caus = couse; } / ***詳細情報を取得* / public String getMessage(){return dettermentMessage; } / ***詳細情報を取得* / public String getLocalizedMessage(){return getMessage(); } / ***原因オブジェクトを取得* / public throwable getCause(){return(cause == this?null:couse); } /***原因オブジェクトを初期化します。この方法は、初期化なしに1回のみ呼び出すことができます*/ public同期されたスロー可能な初期症(スロー可能原因){//それが未知の状態ではない場合は、(this.caus!= this)新しい違法なexception(「原因を上書きできません」)を投げる場合、例外をスローします。 //設定する原因オブジェクトはそれ自体に等しく、例外をスローします(原因== this)新しいIllegalargumentException( "自己認証は許可されていない"); //原因オブジェクトを設定します。 //セットを返す原因オブジェクトを返します。 } / ***文字列表現* / public string toString(){string s = getClass()。getName();文字列メッセージ= getLocalizedMessage(); return(message!= null)? (s + ":" +メッセージ):s; } / ***エラートラックを印刷* / public void printstacktrace(){printStackTrace(System.err); } /***エラートラックを印刷* /public void printStacktrace(printStream s){synchronized(s){//現在のオブジェクトのtoStringメソッドを呼び出しますs.println(this); //例外トラックアレイstacktraceElement [] trace = getourstacktrace(); //(int i = 0; i <trace.length; i ++)s.println( "/tat"+trace [i])の各要素の文字列表現を印刷します。 //原因オブジェクトを取得する可能性のあるOurCause = getCause(); //原因オブジェクトの情報を再帰的に印刷してください(OurCause!= null)ourCause.PrintStackTraceAscause(s、Trace); }} /***原因オブジェクト情報を印刷* @paramの印刷ストリーム* @param candedtrace例外トラックこのオブジェクトによって引き起こされた例外トラック* /private void printstacktraceascause(printstream s、stacktraceelement [] condertrace){// // Mは現在の例外トラックアレイの最後の要素であり、// nは現在のオブジェクトint m = trace.length-1、n = coundtrace.length-1によって引き起こされる例外トラックアレイの例外トラックアレイの最後の要素です。 // 2つの配列の後ろからそれぞれループします。等しい場合、不平等または配列が始まりに到達するまでループします(m> = 0 && n> = 0 && trace [m] .equals(courdttrace [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"); //このオブジェクトの原因を取得し、情報を再帰的に投げられるurcause = getCause(); 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]); showable ourcause = getCause(); if(ourcause!= null)ourcause.printstacktraceascause(s、trace); }} / ***原因オブジェクトに関する情報を印刷* / private void printstacktraceasasause(printwriter s、stacktraceelement [] condertrace){// assert thread.holdslock(s); //この間で共通のフレームの数を計算し、stacktraceElement [] trace = getourstacktrace(); int m = trace.length-1、n = coldingtrace.length-1; while(m> = 0 && n> = 0 && trace [m] .equals(coldingtrace [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"); //原因がある場合は再curseします。 if(ourcause!= null)ourcause.printstacktraceascause(s、trace); } / ***例外トラックに記入* / public同期ネイティブスロー可能なfillinstacktrace(); / ***現在の例外トラックのコピーを返します*/ public stacktraceElement [] getStackTrace(){return(stacktraceElement [])getourstacktrace()。clone(); } /** *現在の例外トラックを取得 * /private同期StacktraceElement [] getourStacktrace(){//このメソッドが初めて呼び出された場合、例外トラックアレイが初期化されている場合、(stacktrace == null){//例外トラック深さint int = getstacktracedepth(); //例外トラックの新しい配列を作成し、stacktrace = new stacktraceElement [深さ]を入力します。 for(int i = 0; i <depth; 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)新しいnullpointerexception( "stacktrace [" + i + "]"); //現在のオブジェクトの例外トラックを設定しますthis.stacktrace = defensiveCopy; } / ** *例外トラックの深さ0は、 * / private native int getStackTraceDepth()を取得することができないことを意味します。 / ***指定されたビットポイントの例外トラックを取得*/プライベートネイティブStackTraceElement GetStackTraceElement(int index); private同期void writeObject(java.io.objectOutputStream s)throws ioException {getourstacktrace(); S.DefaultWriteObject(); }}