1

オプションA:

public void method() {
  try {
    // some operation that throws FirstException
  } catch (FirstException ex) {
    throw new RuntimeException(ex);
  }
  try {
    // some operation that throws SecondException
  } catch (SecondException ex) {
    throw new RuntimeException(ex);
  }
}

オプションB:

public void method() {
  try {
    // some operation that throws FirstException
    // some operation that throws SecondException
  } catch (FirstException ex) {
    throw new RuntimeException(ex);
  } catch (SecondException ex) {
    throw new RuntimeException(ex);
  }
}

どちらが優れているのか、そしてその理由は?

4

4 に答える 4

2

パフォーマンスに関する質問の場合は、いいえ、両方のオプションに違いはありません。どちらも同じ処理オーバーヘッド、同じコンパイル時間(多かれ少なかれ)を持っています。問題は、機能性と読みやすさに関するものです。

もちろん、オプションBの方が読みやすくなっています。

ただしRuntimeException、catchブロックにをスローしていなかった場合は、オプションAを使用することをお勧めします。これは、オプションAでは、最初の例外がスローされた場合でも2番目の操作が実行されるためです。

After an exception is thrown from a try block the execution control will never return to the same try block.

ただし、オプションAでは、オプションBとは異なり、両方の操作が別々のtryブロックにあるため、そのような問題は発生しません。最初の操作で例外が発生してそれを処理した後、オプションAで許可をコーディングすると、 2番目の操作に進むことができます。

ただし、キャッチブロックからのスローに固執している場合はRuntimeException、私が言ったように、読みやすさを除いてどちらのオプションにも違いはありません。

于 2012-05-22T14:42:25.733 に答える
0

最初のオプションでthenをスローしていなかった場合は RuntimeException(ex)、2回目の試行も実行されます。

2番目のオプションでは、の最初の行tryがスローされた場合、ブロックFirstException内の他の行は実行されませんでした。try

于 2012-05-22T14:30:54.847 に答える
0

オプションAでは、両方の例外をキャッチできます。オプションBでは、FirstExceptionがスローされない場合にのみ、SecondExceptionをキャッチします。

FirstExceptionが常にスローされる場合は、到達不能なステートメント(SecondExceptionのコード)があります。これはコンパイラエラーを生成しません

于 2012-05-22T14:31:55.690 に答える
0

Luiggiは正しいです。Bの方が読みやすいです。しかし、Davidは非常に重要なことを言いました。例外処理を区別していないので、次のことができます。

public void method() {
  try {
    // some operation that throws FirstException
    // some operation that throws SecondException
  } catch (Throwable ex) {
    throw new RuntimeException(ex);
  }
}

将来の新しい例外を別の方法で処理したくないことを考えると。

于 2012-05-22T14:33:08.530 に答える