(i)Javaの例外階層
Javaのチェックされた例外と未確認の例外の違いを理解するには、まずJavaの例外階層を見てみましょう。
これは、単純化されたJava例外階層図です。すべてのクラスはスロー可能から継承できることに注意してください。次のレイヤーは、エラーと例外の2つの構造に分割されます。エラークラスレベルでは、Javaランタイムシステムの内部エラーとリソース排出エラーについて説明します。このエラーをユーザーに単純に報告し、プログラムが安全に終了しないようにしようとするだけでなく、一般に他のソリューションがあります。
(ii)チェックされていない例外とチェックされた例外の違い
上記を理解した後、チェックされた例外とチェックされていない例外が何であるかを見てみましょう。実際、Java言語仕様は、これら2つの非常にシンプルなものを定義しています。エラーまたはruntimeexceptionから導き出された例外は未チェックの例外と呼ばれ、他のすべての例外はチェックされた例外になります。この定義は非常に単純ですが、RuntimeExceptionは非常に混乱する概念です。私たちのすべての例外は、プログラムを実行するプロセスにあるようです。効果的なJavaにおけるru ntimeexceptionの私の説明はそれほど満足のいくものではありません。
回復可能な条件のためにチェックされた例外を使用し、プログラミングエラーにランタイムの例外を使用します(第2版の項目58)
ただし、この文から、単純に拡張できます。つまり、 runtimeexceptionが発生した場合、プログラマ自身にとって問題でなければなりません。たとえば、アレイサブスクリプトは範囲外であり、Null Pointerの例外にアクセスします。少し注意を払う限り、これらの例外はエンコーディング段階で回避できる例外です。これらの2つの概念を区別するのが難しいと考えている場合、「最も暴力的な」方法は、一般的なruntimeexceptionを暗記することです。
(iii)なぜ未確認の例外とチェックされた例外を区別する必要があるのですか?
その理由は実際には非常に単純です。コンパイラは、すべてのチェックされた例外に対して例外処理メカニズムを提供するかどうかを確認します。たとえば、class.forname()を使用して特定の文字列のclassオブジェクトを見つける場合、このメソッドの例外処理が提供されていない場合、コンパイルは渡されません。
(iv)どのような例外を宣言すべきですか?
先に述べたように、RuntimeExceptionはプログラミングプロセス中に回避できるエラーです。それで、これらの例外を投げる必要はありませんか?原則として、これは事実ですが、Java仕様はこれを制限していません。アレイを範囲外に捨てて、実際的な意味はありません。それどころか、特定のパフォーマンス損失を引き起こすでしょう。では、スロー例外をどのように設計する必要がありますか?スローの例外を宣言するには、次の2つの状況が必要であることを覚えておく必要があります。
IOExceptionなどのチェックされた例外の方法を呼び出します。理由については、前述のことを説明しましたが、チェックされたすべての例外がスローされた場合、コンパイルすることはできません。プログラムの実行中にエラーが見つかり、スローステートメントを使用して例外がスローされました。未確認の例外の場合、主な状況は2つしかありません。回避可能な(ランタイム例外)または制御不能のいずれかです。これらには、例外の宣言も必要です。
上記のノート2に記載されている厄介なことを説明する例を次に示します。
まず、例外から継承された基本的な例外クラスGenericexceptionを定義します。
パッケージCheck_unchecked_exceptions; public class genericexceptionは例外{ / ** * * * / private static final long serialversionuid = 2778045265121433720l; public geneicexception(){} public genecexception(string msg){super(msg); }}以下は、テストクラスVerifyExceptionを定義します。
パッケージcheck_unchecked_exceptions; public class verifyexception {public void first()throws genericexception {throw new Genericexception( "Checked Exception"); } public void second(string msg){if(msg == null){throw new nullpointerexception( "Unchecked Exception"); }} public void third()throws genericexception {first(); } public static void main(string [] args){verifyexception ve = new verifyexception(); {ve.first(); } catch(genericexception e){e.printstacktrace(); } ve.second(null); }}実行後、Eclipseのコンソールに関する次の情報を取得します。
check_unchecked_exceptions.genericexception:exceptionを確認します
Check_unchecked_exceptions.verifyexception.first(verifyexception.java:6)
Check_unchecked_exceptions.verifyexception.main(verifyexception.java:23)
スレッド「Main」Java.lang.NullPointerExceptionの例外:チェックされていない例外
Check_unchecked_exceptions.verifyexception.second(verifyexception.java:11)
Check_unchecked_exceptions.verifyexception.main(verifyexception.java:29)
上記の例では、チェックされたチェックの概念と組み合わされて、親クラスの例外はチェック型のタイプであることがわかりますが、そのサブクラスのruntimeexception(サブクラスnullpointerexception)はチェックされていません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。