4

マルチキャッチをいつ使うべきかわかりません。マルチキャッチ例外のコンパイル時のタイプが複数の例外タイプの最も近いスーパータイプであるといういくつかの投稿を見ました。

例外タイプ A、B、およびそれらに最も近いスーパー タイプ C があるとします。

オプション1

try{//whatever}
catch(A|B ex){//whatever}

オプション 2

try{//whatever}
catch(C ex){//whatever}

オプション 3

try{//whatever}
catch(A ex){//whatever}
catch(B ex){//whatever}

複数の例外がスローされたときに、上記のオプションを使用する必要がある理想的な状況はどれですか?

4

4 に答える 4

7

Oracleのドキュメントによると、新しい multi-catch ブロックの注目すべき点は次のとおりです。

catch (IOException|SQLException ex) {
   logger.log(ex);
   throw ex;
} 

catch ブロックが複数の例外タイプを処理する場合、 catch パラメーターは暗黙的に finalになります。この例では、catch パラメーター ex は final であるため、catch ブロック内でそれに値を割り当てることはできません。複数の例外タイプを処理する catch ブロックをコンパイルして生成されたバイトコードは、それぞれ 1 つの例外タイプのみを処理する多くの catch ブロックをコンパイルするよりも小さくなります (したがって優れています)。複数の例外タイプを処理する catch ブロックは、コンパイラによって生成されるバイトコードに重複を作成しません。バイトコードには例外ハンドラの複製がありません。

例外を別の方法で処理できる場合は、それらを個別にキャッチする必要があると思います。例外処理が複数の例外で同じである場合は、multi-catch ブロックを使用できます。

try{//whatever}
catch(A ex){//do something specific for A}
catch(B ex){//do something specific for B}

try{//whatever}
catch(C ex){
 //C is superclass of A and B and you are not concerned about the specific type 
 // will catch even other exceptions which are instanceof C
}

try{//whatever}
catch(A|B ex){//do the same thing for both A and B}
于 2013-06-27T05:57:28.737 に答える
0

例外の処理方法によって異なります。

ケース1 両方のタイプの例外がキャッチされ、処理されます

ケース2では、タイプCのみがキャッチされ、サブタイプの例外とハンドルです

ケース3の場合 Aタイプ、Bタイプ共に別扱いとなります。

ケース1とケース3の両方の最終結果は同じです。ただし、ケース 3 ではコードの理解可能性または可読性が向上します

于 2013-06-27T06:10:25.750 に答える
0

各オプションをいつ使用するか:

オプション 1 : A または B に共通のスーパークラスはありませんが、それらを処理するコードは同じになります。

オプション 2 : A と B は共通のスーパークラスとして C を持っています。気にせず、両方を同じように扱ってください。

オプション 3 : A は B とは異なる方法で処理する必要があります

于 2013-06-27T05:59:06.883 に答える