、Javaの異常
プログラムでは、プログラマのエラーが存在しないファイルを開こうとすると、等を、例えば、不正なデータ利用者のための予想外の状況やプログラマの制御可能な範囲外の環境で発生する可能性があります。タイムリーかつ効果的なプログラムで実行時エラーを処理することができるようにするために、Javaは特殊な例外クラスを紹介します。
二、Javaの一般的な例外カテゴリ
第三に、なぜ例外
例外は、主に次の三つの理由で、Javaで生成されます。
- 例外例外は、Java仮想マシンJavaは内部エラーが発生しました。
- エラーに書き込まれたプログラムの異常コードは、例えば、ヌル・ポインタ例外、異常な配列の境界を生成しました。この異常は未確認の異常と呼ばれ、一般的にいくつかのクラスでそれらを処理するために集中する必要があります。
- 手動throw文の異常によって発生する、そのような異常は、一般的に必要な情報のメソッドの呼び出し側に通知するために使用さ異常チェックを、と呼ばれます。
第四に、どのように異常発生したのですか?
私たちは、例外オブジェクトを生成し、スロー(スロー)は例外と呼ばれるランタイムシステムに提出してください。あなたがキャプチャ(キャッチ)例外として知られているプロセスであるオブジェクトの種類を、見つけるまで、システムは、実行時のコールスタックの方法で例外を処理することが見えます。
Java例外は、プログラムの堅牢性とセキュリティを検討するユーザーを強制します。例外処理は、プログラムの通常の流れを制御するために使用すべきではない、その主な役割は、例外が動作し、対応する処理中に発生プログラムを捕捉することです。例外を発生する可能性のあるメソッドを処理するコードを書く、我々は、次の3つの原則に従うことができます。
- 例外をキャッチするために、現在のメソッドの宣言のtry catchステートメントで使用されます。
- この方法は、それをカバーし、カバーされたときと同じ方法では、例外または例外サブクラスをスローする必要があります。
- 親クラスは複数の例外をスローする場合、オーバーライドメソッドは異例のサブセットをスローする必要がありますが、新しい例外をスローすることはできません。
(参考:のhttp://c.biancheng.net/view/1038.html)
第五に、JVMの観点は、異常な表現を生成します
サンプルコードを見てください:
パブリック クラスFooの{ プライベート 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 :私は 33 :aload_2 34 athrow: 35 :aload_0 36 :iconst_3 37:putfield#6 // フィールドmethodExit:I 40:戻り 例外テーブル: タイプを標的とするから 0 5 13クラスのJava / langは/ 例外 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 * / スタック = [ クラスのJava / LANG / 例外] FRAME_TYPE = 77 / * same_locals_1_stack_item * / スタック = [ クラスのJava / LANG / のThrowable] FRAME_TYPE = 7 / * 同じ* /
バイトコードは、コメントから見ることができ、finallyブロックは3ヶ所に追加されます。これは、バイトコードファイルにJavaコードから翻訳、JVMが最終的にしようとする論理ブロックとcatchブロックでブロック生成時に、あります。しかし、それについて考える、なぜ3「ついに」それ?catchブロック内のコードを実行しながら、最終的に準備され、最後の例外が発生しました。最終的にそれを行う方法を、エラーをブロック内のコードがあるのであれば、一つは、求めることができますか?ここでは、自分自身を証明すべき事実の、導入:投げ出される、に対処するためのコードの層。
ここでは、バイトコードの黄色の部分を説明します。
例外が発生した場合に異常を示す例外テーブルテーブル、異常に関連するすべてのコードを格納するための例外テーブルは、各クラスをコンパイルした後に、例外テーブルに続く、対応する行(すなわち、それぞれのタグ例外テーブルに最初に見えます
try{}catch(){}
コードブロック)が見つかった場合は見つかっていない場合は、最後に返却した後、実行が)(そして、例外ハンドラにジャンプし、というように、呼び出しが親テーブルを照会するために、親の異常なコピーに発信者を適用し、 。...まで:モニタ例外ハンドラは、(例えば、コードを含むブロックを試みる)範囲を示します
ターゲット:例外ハンドラは、(catchブロックを含むコードのような)開始位置を表します
タイプ:それは例外処理であります
例外が発生した後、次に、どのように例外テーブルを制御するには?
プログラムは上から表の一番下の横断異常なエントリには例外、Java仮想マシンをトリガーする場合。インデックス値のバイトコードが例外テーブルエントリの監視の範囲内で例外をトリガしたときに異常な試合は、Java仮想機会がスローされた例外とあなたがキャプチャしたい項目を判断します。試合は、Java仮想マシンはコードのエントリポインタ上のターゲットへの流れを制御する場合、プログラムは実行を継続します。
バイトコード例外テーブルに関する分析、下記:
起動プログラムは、1に走る:iconst_0、例外例外が発生し、プログラムは、最初の行から、便利なメソッドテーブルに行く検出0 <a <5は、検出範囲は、最初のエントリに対応し、再度スローチェックバイトコード番号13へのジャンプが実行を継続した後、異常な例外は、エントリは、捕捉例外処理と一致します。より14における場合:例外がaload_0発生し、プログラムが例外表にジャンプすると、一致し、最終的な目標は、バイトコード27のシリアル番号を見つけることです珍しいエントリを探し、それをバイトコードに至るまでのすべてを完了しました。
所属異常の例としては、catchブロックで発生し、それから放り出されathrowバイトコードの後にステップがある見られます。
さて、JVMはこの例外を参照してください。
(引用:ギーク時間)