11
public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } catch (Exception e) {
        throw e;
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

これは、catch 句を省略した場合とは異なる動作をしますか?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

[編集] 混乱を解消するために、はい、catchブロックは例外を再スローする以外は何もしません。これにより、ブロックが呼び出されたときに何らかの異なる順序が発生したかどうか疑問に思っていましたがfinally(スローされた例外が呼び出し元によってキャッチされたと仮定します)、これまでの回答から推測すると、そうではありません。

4

5 に答える 5

7

それらは同じです。私は2番目のバージョンを使用します。

于 2011-05-04T21:02:08.220 に答える
5

はい。メソッドはすでに「例外」をスローしているため、それをキャッチして再スローする必要はありません。@Daveが言及したことをしたい場合を除きます。

于 2011-05-04T21:02:42.603 に答える
3

2 つのソース コードは同じ実行シーケンスを表していますが、異なるバイトコードになります。たとえば、最初のルーチンには例外テーブルがありますが、2 番目のルーチンにはありません。それらのバイトコードは、インストルメンテーションがない場合、実行中に同じ効果を持ちます。コンパイル後にバイトコードがインストルメント化されている場合、またはキャッチされた例外が実行中にクラスファイルを使用できないタイプである場合、これらのメソッドの動作が異なる可能性があります。

于 2011-05-04T21:25:30.923 に答える
2

catch 句でキャッチした例外をスローし、それを再度スローする以外に何もしないので、はい、両方のコードが同じことを行います。

于 2011-05-04T21:03:51.967 に答える
1

そうです、同じです。スタックトレースもそこにあります:)

ただし、例外をより高いレベルの例外にラップすると、同様のコードが使用される場合があります。コードが記述どおりに見える場合、それは本当に無意味です。

于 2011-05-04T21:01:55.690 に答える