ホームページ  >  記事  >  Java  >  JVM を使用して Java 例外をキャッチするにはどうすればよいですか? (例付き)

JVM を使用して Java 例外をキャッチするにはどうすればよいですか? (例付き)

不言
不言転載
2019-03-19 09:31:332575ブラウズ

この記事の内容は、JVM を使用して Java 例外をキャッチする方法についてです。 (例もあり)ある程度の参考になるので、困っている友達は参考にしていただければ幸いです。

1. 例外の 2 つの重要な要素

(1) 例外のスロー
1. 明示的: アプリケーションは手動で例外をスローします。具体的には、 throw を使用して例外をスローします
2. 暗黙的: Java 仮想マシンは、実行できないコードに対して自動的に例外をスローします

(推奨: Java チュートリアル )

(2) 例外のキャッチ##1.try コード ブロック: 例外の監視が必要なコードをマークするために使用されます。
2.catch コード ブロック: try コード ブロックに続き、try コード ブロックでトリガーされた指定されたタイプの例外をキャッチするために使用されます。 catch ブロックは、キャッチされる例外のタイプを宣言するだけでなく、その例外タイプの例外ハンドラーも定義します。 Java では、try コード ブロックの後に複数の catch コード ブロックを続けて、さまざまな種類の例外をキャッチできます。 Java 仮想マシンは、例外ハンドラーを上から下まで照合します。したがって、前の catch コード ブロックによってキャプチャされた例外タイプは、次の例外タイプをカバーできません。そうでない場合、コンパイラはエラーを報告します。
3.fnally コード ブロック: try コード ブロックと catch コード ブロックに続いて、実行する必要があるコードの一部を宣言するために使用されます。これは、オープン システム リソースを閉じるなど、特定の重要なクリーンアップ コードをスキップしないように設計されています。通常のプログラム実行では、このコードは try ブロックの後に実行されます。それ以外の場合、つまり、try コード ブロックが例外をトリガーしたときに、例外がキャッチされなかった場合、fnally コード ブロックは直接実行され、実行後に例外が再スローされます。例外が catch ブロックによってキャッチされた場合、finally ブロックは catch ブロックの後に実行されます。残念な状況では、catch ブロックも例外をトリガーし、その後 fnally ブロックも実行され、catch ブロックによってトリガーされた例外がスローされます。非常に残念な状況では、最終的なコード ブロックも例外をトリガーするため、現在の最終的なコード ブロックの実行を中断して例外をスローする必要があります。

2. 例外の分類

JVM を使用して Java 例外をキャッチするにはどうすればよいですか? (例付き)

1. すべての例外の親クラスは Throwable です

2. エラー例外はプログラムの実行状態は復元できません。スレッドを終了するか、JVM を終了することしかできません。
3.例外は、エラーよりも重大な例外ではありません。
4.実行時例外とエラーは、必要のない例外です。チェックする必要があります
5. 実行時例外とエラーを除くすべての例外はチェック例外です
6. チェック例外例外は明示的にキャッチする必要がある例外です

3. Java 仮想マシンはどのように動作しますか例外をキャッチしますか?

Java 仮想マシンが例外インスタンスを作成すると、非常にコストがかかります。仮想マシンは例外のスタック トレースを生成する必要があります。この操作は、現在のスレッドの Java スタック フレームに 1 つずつアクセスし、スタック フレームが指すメソッドの名前、メソッドのクラス名とファイル名、コード内の行などのさまざまなデバッグ情報を記録します。例外がトリガーされた場所。
例外インスタンスの構築には非常にコストがかかるため、例外インスタンスをキャッシュし、必要に応じて直接スローすることはできますか?文法の観点からは、これは許可されています。ただし、この例外に対応するスタック トレースは、throw ステートメントの場所ではなく、新しい例外の場所です。
したがって、このアプローチは開発者を誤解させて、間違った場所をターゲットにする可能性があります。実際には、新しい例外インスタンスをスローすることを選択することが多いのはこのためです。

例外ハンドラー1. ソース: 各メソッドはコンパイル中に例外テーブルを生成します。例外テーブルの各エントリは例外ハンドラーを表します。
2. 構成:
(1) from pointer, to pointer: 例外をキャッチする範囲、つまり Try の範囲を表します。
(2)ターゲット ポインタ: プロセッサの開始位置を表します。これはキャッチの開始位置です。
(3)例外タイプをキャッチしました。
3. 例外のキャッチ
(1) プログラムが例外をトリガーすると、Java 仮想マシンは例外テーブル内のすべてのエントリを上から下まで走査します。例外をトリガーしたバイトコードのインデックス値が例外テーブル エントリの監視範囲内にある場合、Java 仮想マシンは、スローされた例外がエントリがキャッチしようとしている例外と一致するかどうかを判断します。一致する場合、Java 仮想マシンは、エントリのターゲット ポインタが指すバイトコードに制御フローを転送します。
(2) すべての例外テーブル エントリを調べても、Java 仮想マシンが依然として例外ハンドラと一致しない場合、現在のメソッドに対応する Java スタック フレームをポップアップし、呼び出し元で上記の操作を繰り返します。最悪の場合、Java 仮想マシンは、現在のスレッドの Java スタック上のすべてのメソッドの例外テーブルを走査する必要があります。
4.finally コードのコンパイル: Java コンパイラの現在のバージョンは、fnally コード ブロックの内容をコピーし、try-catch コード ブロックのすべての通常実行パスと例外実行パスの出口に配置します。

代码1:
Try{
Try block
} catch {
Catch block
} finally {
Finally block
}
代码2:
Try {
Try block
Finally block
} catch {
Catch block
Finally block
} finally{
Finally block
}
コード 1 は Java コード、コード 2 はコンパイルされた Java コードです。

注: catch コード ブロックが例外をキャッチし、別の例外をトリガーした場合、fnally はどの例外をキャッチして再スローしますか?答えは後者です。つまり、元の例外は無視され、コードのデバッグに非常に悪影響を及ぼします。

5.Java7 の抑制された例外と構文的糖衣

前のセクションで述べたように、例外のキャッチは無視されますが、Java7 では抑制された例外処理の問題が導入されました。しかし、それでも使用するのは非常に面倒です (経験なし、

以上がJVM を使用して Java 例外をキャッチするにはどうすればよいですか? (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。