1

クラス X があります。X クラスのメソッドmethod()は をスローしSomeExceptionます。

例外を処理するどの方法が優れているか、より効率的か疑問に思います。例外とすべての依存関係をスローする try ブロック メソッドを囲んでいる場合、または try ブロックの外側に依存関係を保持しているが、失敗後にメソッドから戻っている場合。

1.

public void test() {
     X x = new X();

     try {
          T temp = tx.method();
          temp.doWhatever();
     }

     catch(SomeException e) { handleException(e); }
}

また

2.

public void test() {
     X x = new X();
     T temp = null;
     try {
          temp = tx.method();
     }

     catch(SomeException e) { 
          handleException(e);
          return;
     }

     temp.doWhatever();
}

編集済み:(注釈の後)

さらに、次のようなコードを理解しています。

1. tx.method()例外がスローされるため、次に実行されるのはcatchブロックです。プログラムが行をスキップし、何もないため、それtempはまだ問題ではありません。nulltemp.doWhatever();NullPointerException

2.ここでは、実行したくないので命令を使用しreturnますtemp.doWhatever()tempnull

4

6 に答える 6

1

例外が機能する方法の重要なポイントの 1 つは、スタイル番号 1 を使用できることです。つまり、コードのブロックが壊れた場合はフローが中断され、エラーが処理されるので、安心してコードのブロックを実行できます。したがって、私は常に最初のスタイルをお勧めします。

于 2012-07-12T17:34:16.230 に答える
1

temp は内部で宣言されているため、最初のもののみが可能です。

私は個人的に最初のものを選びます。それ以外の場合は、試行の前に次のように宣言する必要があります: T temp = null.


質問の修正後:

プロファースト

最初のコードはジャンプ命令が少なく、変数tempはよりローカルで、null の初期化がありません。

また、コーディング スタイルがよりコンパクトになり、null の初期化がなく、エラー ポイントになる可能性があります。

さらに、例外は見えないようにする必要があります。最初のバージョンの方が読みやすいです。例外は、線形コーディングおよび読み取りプロセスを中断してはなりません。

プロセカンド

例外がどこから発生するかがより明確になります。

于 2012-07-12T17:31:54.113 に答える
0

オプション2は、拡張性の理由から不適切です。後で誰かが、例外的なケースが発生した場合でも、test.doWhatever()の後にtest()が何かを実行する必要があると判断したとします。その時点で、コードをオプション1にリファクタリングする必要があります。最初からオプション1を使用するのに費用がかからないので、それをしなければならない理由はありません。

さらに、コンパイラーがそれを受け入れたとしても、catchブロックから戻ることにより、try/catchブロックの設計原則に違反します。例外的なケースのためにアクションが呼び出されるため、キャッチをリターンポイントにするには、例外をスローする必要があります。

于 2012-07-12T18:33:09.303 に答える
0

2 番目のケースは、ブロックtempの外側からは見えないため、コンパイルさえできません (そして意味がありません) 。tryいずれにせよ、私はこれに行きます:

public void test() {
     X x = new X();

     try {
          T temp = tx.method();
          temp.doWhatever();
     }

     catch(SomeException e) { handleException(e); }
}

初期化tempに失敗した場合、残りのtemp操作は実行されません。

于 2012-07-12T17:32:01.353 に答える
0

メソッドに複数の戻り値があるのは良くありません。しかし、それは単に理解できるコードを持つためです。ブール値と if を使用してリターンを回避できます。

効率的には問題ないと思います。最初のステートメントで例外が発生した場合、2 番目のステートメントは実行されません。例外がなければ...うーん...2番目の方法によるオーバーヘッドはないと思います。「アセンブラー」コードがどのように見えるかを、try catch :D で通知できます。

私の意見では、理解できないコードを書くことがより重要です。最近のコンパイラは非常に優れており、ほとんどのことを最適化しています。

于 2012-07-12T17:42:52.320 に答える
-1

2つの方法に違いは見られません。

于 2012-07-12T17:29:43.680 に答える