この記事は、Java の例外処理メソッド (コード付き) を紹介します。一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。
はじめに: 私たちの仕事や生活においては、さまざまな「間違い」や突発的なさまざまな「異常」が必ず起こります。どれだけ準備やテストを行っても、これらの異常は必ずいつかは発生し、適切に対処されなかったり、対処が間に合わなかったりすると、新たな問題を引き起こすことがよくあります。したがって、これらの落とし穴に常に注意を払う必要があり、完全な例外処理メカニズムを確立するには一連の「ベスト プラクティス」が必要です。
#本文
異常分類
まず、ここで異常分類の構造図を描きました。
JDK では、Throwable はすべての例外の親クラスであり、「エラー」と「例外」に分けられます。エラーは、OutOfMemoryError など、制御できない重大なエラーが発生したことを意味します。例外は 2 つのカテゴリに分類されます。チェックされた例外 (チェック) では、手動で try/catch またはメソッド定義をスローする必要があります。コンパイラはコンパイル中にその正当性をチェックします。チェックされていない例外 (チェックを外す) については、事前に処理する必要はありません。これらの単純な概念は、開発者が習得する必要があります。ここでは、詳細な説明は省略して、図を示します。私たちの「夕食」はまだ続きます。
try/catch/finally を再理解する
例外処理に関しては、ここで try/catch/finally について言及する必要があります。 try は単独で存在することはできません。catch、finally、または 3 つすべてを同時に組み合わせる必要があります。
1. コード ブロックを試してみる: コード ブロックの実行を監視します。対応する例外が見つかった場合はキャッチにジャンプし、キャッチがない場合は直接 Final ブロックに進みます。
2. コード ブロックのキャッチ: 対応する例外が発生すると、内部のコードが実行され、処理されるか上向きにスローされます。
3. 最後にコード ブロック: 例外があるかどうかに関係なく実行する必要があり、通常はリソースのクリーンアップや接続の解放などに使用されます。ただし、ここにあるコードが実行されない状況がいくつかあります。
コード実行プロセスは、try コード ブロックに入りません。 - コードは、try コード ブロック内で無限ループ、デッドロック、およびその他の状態で発生します。
- System.exit() 操作は try コード ブロックで実行されます。
-
try/catch/finally トラップ
tcf を使用するときに遭遇する可能性のある 2 つのトラップを次に示します。
コード 1
public class TCFDemo {
public static void main(String[] args) {
//11
System.out.println(returnVal());
}
static int returnVal(){
int a = 1;
int b = 10;
try{
return ++a;
}finally {
return ++b;
}
}
}
ログイン後にコピー
トラップ 1:finally に return ステートメントを追加すると、try コードの戻り値が上書きされます。ビジネス ロジックが複雑な場合、次のような問題に陥りやすくなります。ここにトラップ、いいえ エラーのトラブルシューティングに役立ちます。
コード 2
public class TCFDemo {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
try{
//有可能加锁失败
lock.lock();
//dost
}finally {
lock.unlock();
}
}
}
ログイン後にコピー
トラップ 2: lock メソッドはロック時に Uncheck 例外をスローする可能性があるため、try コード ブロック内にある場合は、必然的にロック解除メソッドが実行されます。このとき、ロックが失敗したため IllegalMonitorStateException がスローされますが、このように後者の例外によって前者のロック失敗の例外情報が上書きされるため、ロックメソッドを try コードブロックの外に移動する必要があります。
ベスト プラクティス
さて、例外の分類と try/catch/finally の注意事項を簡単に紹介しました。例外を処理するときの「ベスト プラクティス」は何ですか?
例外を上向きにスローする必要がある場合は、現在のビジネス シナリオに応じてビジネス上の意味を持つ例外を定義する必要があり、業界内で定義された例外またはチーム内で定義された例外を優先して使用します。たとえば、dubbo を使用してタイムアウトになるリモート サービス呼び出しを行うと、RuntimeException を直接スローする代わりに、DubboTimeoutException がスローされます。 - 戻り値の判断が複雑になるのを避けるため、finally コード ブロック内で return ステートメントを使用しないでください。
- 例外やスロー可能ではなく、例外の特定のサブクラスをキャッチします。これにより、JVM によってスローされた処理できない重大なエラーを含む、すべてのエラーが捕捉されます。
- 例外を無視しないように注意してください (処理を行わずに例外をキャッチします)。たとえそれがロジックの通常の動作に影響を及ぼさないことを現時点で確認できたとしても、コードが後でどのように変化するかは誰も保証できません。未来、自分のために掘らないでください。
- 制御フローとして例外を使用しないでください。これはパフォーマンスにも影響する非常に奇妙なアプローチです。
- リソースのクリーンアップや接続の解放などの操作は、メモリ リークを防ぐために、finally コード ブロックに配置する必要があります。finally ブロックで処理されるロジックが比較的大きく、モジュール化されている場合は、それをツールのメソッド呼び出しにカプセル化できます。コードはより単純になります。
-
終了
小さな異常には多くの知識があると思いますが、どう思いますか?
以上がJava 例外処理メソッドの概要 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。