[解決済み] Javaで2つの例外を同じcatch blockでキャッチすることは可能ですか?重複
2022-05-15 10:09:02
質問
2つの例外が同じ処理ロジックを必要とするため、2つの例外をキャッチする必要があります。というようなことをしたいと思います。
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
各キャッチブロックにハンドラのコードを重複させないようにすることは可能でしょうか?
どのように解決するのですか?
Java 7 以降
多重例外の捕捉 は、Java 7 からサポートされています。
という構文になります。
try {
// stuff
} catch (Exception1 | Exception2 ex) {
// Handle both exceptions
}
の静的型は
ex
は、列挙した例外の中で最も特化した共通のスーパータイプです。 を再スローした場合、その例外が発生するという素晴らしい機能があります。
ex
を再投入すると、コンパイラは列挙された例外のうち1つしか投げることができないことを認識します。
Java 6 およびそれ以前
Java 7 より前のバージョンでは、この問題を処理する方法がありますが、エレガントでない傾向があり、制限があります。
アプローチ#1
try {
// stuff
} catch (Exception1 ex) {
handleException(ex);
} catch (Exception2 ex) {
handleException(ex);
}
public void handleException(SuperException ex) {
// handle exception here
}
の前に宣言されたローカル変数にアクセスする必要がある場合、これは厄介なことになります。
try
. また、ハンドラメソッドが例外を再スローする必要がある(そしてそれがチェックされる)場合、シグネチャで深刻な問題に遭遇することになります。 具体的には
handleException
を投げるように宣言しなければなりません。
SuperException
...これは潜在的に、囲むメソッドのシグネチャを変更しなければならないことを意味し、など。
アプローチその2
try {
// stuff
} catch (SuperException ex) {
if (ex instanceof Exception1 || ex instanceof Exception2) {
// handle exception
} else {
throw ex;
}
}
もう一度、署名の潜在的な問題があります。
アプローチその3
try {
// stuff
} catch (SuperException ex) {
if (ex instanceof Exception1 || ex instanceof Exception2) {
// handle exception
}
}
を省くと
else
の部分(例えば、他に
SuperException
の部分には他のサブタイプがないため) コードはより壊れやすくなります。 例外の階層が再編成された場合、このハンドラで
else
を持たないこのハンドラは、黙って例外を食らってしまうかもしれません!
関連
-
アクセス制限の解決方法: ---- in Java
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Node.jsの例外処理のベストプラクティス
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
javaの非静的メソッドを静的に参照することができない
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Javaジェネリックを1つの記事で
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
Junitのユニットテストエラー
-
htmlとwordの相互変換の実装(画像あり)
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?