2016-07-05 2 views
2

Iコンテナからデータを取り外し、取り外し要素の数を返す関数書いている:コンテナのサイズを返してからfinallyブロックのコンテナを変更するのは安全ですか?

int detach(foo f) 
{ 
    try { 
     /*some code*/ 
     return m_ids.size(); 
    } finally { 
     m_ids.clear(); 
    } 
} 

foojava.util.Listである、m_idsでデータを受信するオブジェクトです。

私の懸念事項:このコードは安全ですか?それがクリアされる前にそれはm_idsのサイズを返しますか?

+3

試してみるのはもっと早いでしょうか? ..その後Googleは "最終的にJavaを試して戻ってください"と公式の文書を探します。 – ABuckau

+1

Cの背景から来て、私はそのような構造の "定義"について懸念しています。 –

+1

@SnoopDog Javaでよく定義されています。 – assylias

答えて

9

コードは安全です。返り値はの前に確立されて(そしてどこかに格納され)、finallyのブロックに達する前にになります。 finallyブロックが実行されると、格納された戻り値が関数呼び出し元に送信されます。

注意はあなたが書かれていた場合は、貧しいコーディングスタイルでは、finallyブロック後、0の最後のステートメントとしてreturn m_ids.size();が呼び出し側に戻されていたであろうことを考えた:finallyブロック内return値は、他のどのreturn値を上書きします。

-5

例外がスローされない場合、finallyブロックは実行されません。

+0

それは間違っています。それは常に実行されます。 – Thomas

+0

これは間違っています! (あなたは毎日何か新しいことを学ぶ)。自分で試してみてください。 – Bathsheba

1

生成されたバイトコードを調べる:

int detach(java.util.List); 
    Code: 
     0: aload_1 
     1: invokeinterface #4, 1 // InterfaceMethod java/util/List.size:()I 
     6: istore_2 
     7: aload_1 
     8: invokeinterface #5, 1 // InterfaceMethod java/util/List.clear:()V 
     13: iload_2 
     14: ireturn 
     15: astore_3 
     16: aload_1 
     17: invokeinterface #5, 1 // InterfaceMethod java/util/List.clear:()V 
     22: aload_3 
     23: athrow 
istore_2

は、次にロードされる(iload_2)と戻さ取得ローカル変数へsizeの結果を格納する動作です。

関連する問題