1

いくつかの I コードをリファクタリングしようとして、次のように catch 句で例外をスローしようとしました -

try {
....
}
catch(Exception exception){
.....
throw exception
}

ただし、「throw exception」行で例外をスローしようとすると、コンパイラーは、throw 句を新しい try/catch で囲む必要があるというメッセージで不平を言いました。

try
{
  ....
}
catch (Exception exception)
{
  .....
  try
  {
    throw exception
  }
  catch (Exception e2)
  {
     ...
  }
}

コンパイラがこれを必要とする理由と、それが提供する用途は何ですか?

ありがとう

4

4 に答える 4

3

例外java.lang.Exceptionはチェック例外です。これはthrows、囲んでいるメソッドの句で宣言するか、メソッド本体でキャッチして処理する必要があることを意味します。

ただし、「修正済み」バージョンで行っていることは、例外をキャッチし、再スローしてからすぐに再度キャッチすることです。それはあまり意味がありません。

実際のコードを見ないと、実際の解決策がどうあるべきかは明確ではありませんが、問題は元のtry { ... } catchハンドラーにあると思います。

  • 可能であれば、その時点でより具体的な例外をキャッチして、再スローしたときにメソッドの既存のthrowsリストに含まれるようにする必要があります。

  • または、例外を未チェックの例外でラップし、代わりにそれをスローすることもできます。

  • 最後の手段として、メソッドのシグネチャを変更Exceptionして throws リストに含めることができます。しかし、それは本当に悪い考えです。なぜなら、問題を呼び出し元にプッシュするだけであり、開発者/読者は、どのような例外が予想されるかわからないという立場に置かれるからです。

于 2011-05-12T22:23:13.023 に答える
1

元のコードでは、スローされた例外をキャッチするものは何もありません。関数が例外をスローするように指定するか、コンパイラがキャッチするように提案する別の try/catch ブロックを用意する必要があると思います。

それ以外の

public void yourFunction(){
  try {
    ....
  }
  catch(Exception exception){
    .....
    throw exception
  }
}

試す

public void yourFunction() throws Exception{
  try {
    ....
  }
  catch(Exception exception){
    .....
    throw exception
  } 
}
于 2011-05-12T22:23:10.650 に答える
1

Java では、チェックされた例外とチェックされていない例外が区別されます。チェックされていない例外は、基本的にコード内の任意の場所でスローされる可能性があり、どこかでキャッチされない場合は、アプリケーションのエントリ ポイントまで伝播し、プロセスを停止します (通常はエラー メッセージとスタック トレースを使用して)。チェックされた例外は異なります: コンパイラは単に伝播させません。チェックされた例外をスローする可能性のあるコードを try-catch ブロックで囲む必要があります (また、例外がまたは、チェック済み例外をスローする可能性のあるコードへの呼び出しを含むメソッドを「throws」宣言でマークする必要があります。目的の動作がチェックされていない例外をスローすることである場合は、例外を RuntimeException にラップする必要があります。例外をチェックし続けることが目的の動作である場合は、現在のメソッドに throws 宣言を追加する必要があります。

于 2011-05-12T22:26:07.917 に答える
0

私の推測では、スローできる例外タイプとしてメソッドによって宣言されていない例外サブクラスをスローしようとしていると思います。

次の例は動作します

package test.example;

public class ExceptionTest {

    public static void main(String[] args) throws Exception{
        try {
            int value = 1/0;
        } catch (Exception e) {
            System.out.println("woops the world is going to end");
            throw e;
        }

    }

}

ただし、この例ではエラーが発生します。

package test.example;

public class ExceptionTest {

    public static void main(String[] args) throws RuntimeException{
        try {
            int value = 1/0;
        } catch (Exception e) {
            System.out.println("woops the world is going to end");
            throw e;
        }

    }

}

2 番目の例では、RuntimeException ではなく単に Exception をキャッチしていることに注意してください。RuntimeException を宣言していても、宣言されていないスローである Exception をスローすると、コンパイルされません。

はい、例外は RuntimeException ですが、コンパイラはそれを知りません。

3 番目の実例を考えてみました。宣言したのと同じ型をスローするため、これも機能します。(唯一の変更点は catch ブロックであることに注意してください)

package test.example;

public class ExceptionTest {

    public static void main(String[] args) throws RuntimeException{
        try {
            int value = 1/0;
        } catch (RuntimeException e) {
            System.out.println("woops the world is going to end");
            throw e;
        }

    }

}

これら3つの答えすべての違いを理解する必要があります

于 2011-05-12T22:31:23.827 に答える