6

より正確な再スローにより、実際にスローされた例外をスローするコードを記述できます。

   public void foo(String bar) throws FirstException, SecondException {
     try{
       // Code that may throw both FirstException and SecondException
     }
     catch (Exception e){
       throw e;
     }
   }

Java 7 より前は、次のように記述する必要がありました。

   public void foo(String bar) throws Exception {
     try{
       // Code that may throw both FirstException and SecondException
     }
     catch (Exception e){
       throw e;
     }
   }

私の質問Exception: " " を " "に置き換えるために不正確なスローを検出できるツールはありますFirstException, SecondExceptionか?

これまでのところ、Eclipse でコンパイラの警告がないことを確認しました。FindBugs や CodePro にはルールはありません。

4

2 に答える 2

1

「過度に広範な」例外は必ずしも問題ではないため、これはコンパイラの警告の状況ではないと思います。メソッドが final または private でない限り、サブクラスの実装がスローできる例外の種類を定義します。その場合、広い範囲は意図的だった可能性があります。

あなたの質問は、7より前のJavaにも同様に当てはまります。

public void foo(String bar) throws Exception {
    // Code that may throw both FirstException and SecondException
}

ここでは、throws Exception悪い習慣と見なすこともできます (ただし、警告はありません)。

引数の同じ行に沿って、スローできない可能性のある (チェック済みの) 例外をキャッチしようとするとコンパイルエラーが発生throwsすることに注意してください。使用しません。

ただし、FindBugs のようなツールは便利です。


更新:「メソッドが final または private でない限り」: private または final メソッド (およびおそらく静的メソッド) の場合、警告が表示される可能性があることに同意する必要があります。

更新 2: 最終メソッドの場合でも、オプションを開いたままにして、インターフェイスを壊さずに将来さらに多くの例外をスローすることをお勧めします。

于 2011-11-10T11:55:00.657 に答える
-2

スローする前に例外をキャストしてみてください。

public void foo(String bar) throws FirstException, SecondException {
  try{
    // Code that may throw both FirstException and SecondException
  }
  catch (Exception e){
    throw ((e instanceof FirstException) ? (FirstException)e : (SecondException)e);
  }
}

ところで、同じ例外を再スローすることは、私にはかなり不器用に思えます...

于 2011-11-10T11:21:43.747 に答える