35

私は Java に詳しくないので、最近、同僚が書いたコードを見ていて、困惑しています。その要点は次のとおりです。

public response newStuff(//random data inside) {
    try {
       response or = //gives it a value
       log.info(or.toString());
       return or;
    }
    catch ( Exception e) {
        e.printStackTrace();
    }
    finally {
        return null;
    }
}

ここに最終ブロックを追加する意味は本当にありますか? 同じ動作を実行する catch ブロック内に return null を追加することはできませんでしたか、それとも間違っていますか?

4

10 に答える 10

31

ここに最終ブロックを追加する意味は本当にありますか?

これに対する答えは圧倒的に「いいえ」です。ブロックにreturnステートメントを入れることは非常に悪い考えです。finally

catch ブロック内に return null を追加するだけで、同じ動作が実行されますか、それとも間違っていますか?

元の動作とは一致しませんが、修正されるため、これは良いことです。null元のコードのように無条件に戻るのではなく、ブロックreturn内に があるコードはエラーが発生した場合にのみ戻ります。つまり、分岐で返された値は、例外がない限り、呼び出し元に返されます。catchnulltry

さらに、ブロックのreturn null に追加すると、例外catchで返される正しい効果が表示nullされます。さらに進んでreturn、次のようにメソッドにシングルを入れます。

response or = null;
try {
   or = //gives it a value
   log.info(or.toString());
} catch ( Exception e) {
    e.printStackTrace();
}
return or;
于 2013-10-21T15:27:55.100 に答える
5

finally何があっても常に実行され、通常はセッションを閉じるなどに使用できます。finally ブロック内にリターンを入れないでください。

于 2013-10-21T15:27:28.490 に答える
4

これは非常に悪い習慣のように見えます。この場合、コードは常に を返しnullます。

ブロックは、ブロックの実行finally後に最後に呼び出されtry-catchます。try終了またはexceptionブロックが呼び出されたかどうかは関係ありません。この場合、コードのどのパスが実行されても、常に null が返されます。「通常」のケースではreturn null、finally の後に何かを返す可能性が実際にあり (ブロックから、tryまたはcatchブロックから)、戻りオブジェクトを生成するフローがない場合は、 にフォールバックしreturn nullますが、常にそうとは限りません。 null を返します。

于 2013-10-21T15:27:51.973 に答える
4

return多くの人が何の説明もなく、単に「finally ブロックでは使用しないでください」と答えていることを読んだことがあります。実際、あなたが投稿したコードは、ブロックreturn内の afinallyが大きな混乱を引き起こしている良い例です。これを書いている時点で、最も支持されている答えでさえ、間違っていました。Exception があっても、コードは常にreturn null;as last コマンドを実行します。

returnしかし、ブロック内の afinallyが実際に意味を持つ状況を考えることができます。あなたのコードの作成者の目標は、メソッドが をスローするのではなくThrowable、 を返すnullことだったようです。これは、次のようにコードを変更すると実際に実現できます。

public Result newStuff() {
    Result res = null;
    try {
       res = someMethod();
       log.info(res.toString());
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        return res;
    }
}

ただし、これは s および s ではない s を呼び出さないことに注意printStackTrace()ErrorThrowableくださいException

于 2013-10-22T13:41:00.633 に答える
3

「Finally」ブロックは、「Catch」が発火するかどうかに関係なく実行されます。そのため、Catch ブロックに「return null」を入れるだけの場合とは動作が異なります。

于 2013-10-21T15:27:52.897 に答える
1

まず、初心者向けの簡単な言葉でこの 3 つのブロックが必要な理由を理解してください。

1) try ブロック: コードが例外を引き起こす可能性が疑わしい場合は、try ブロックに入れます。

2) catch ブロック: 例外が発生した場合、実行する必要があるコードをこのブロックに記述する必要があります。

3)finally ブロック: 例外が発生するかどうかに関係なく、コードを実行する場合は、finally ブロックに進みます。主に、このブロックはリソースを解放するために使用されます。例えば:

try{
   Connection conn=//something;
   //some code for database operations

}catch(SQLException e){
        e.printStackTrace()
}finally{
      conn=null;
}

結果がどうであれ、使用できる接続オブジェクトが少ないため、参照するとデータベースに負荷がかかる重いオブジェクトであるため、接続をnullにする必要があります。したがって、それらを最終ブロックに保持する最良の方法です。

あなたの場合、例外が発生するかどうかにかかわらず、常に null を返すため、finally ブロックで null を返すことは悪いアプローチです。

于 2013-10-22T10:36:53.253 に答える