- PR -

finallyブロックは正常に完了しません。の警告

投稿者投稿内容
すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2006-10-30 21:34
Eclipseで以下のようにコーディングしてビルドを実行すると、
「finallyブロックは正常に完了しません。」という警告が表示されます。
実行することはできるのですが、なぜこのようなエラーが出るのでしょうか。
ネットで調べても出てこないので、質問させていただきました。
よろしくお願いします。

public boolean start( ActionMapping mapping, ActionForm form,
     HttpServletRequest request, HttpServletResponse response ) throws Exception {

  try{
     HttpSession session = request.getSession( false );
           
     //〜省略〜
     
    }catch( Exception e ){
     System.out.println( "ERROR [ " + e.getMessage() + " ]" );
     e.printStackTrace();
     throw e;

  }finally{
     return true;
  }
}

環境:eclipse 3.2  Struts 1.2.9  Tomcat 5.0.2.8
権兵衛
ベテラン
会議室デビュー日: 2002/09/24
投稿数: 50
投稿日時: 2006-10-30 21:48
ひとつ聞かせてもらいたい。
finallyにreturnを書く意図はなんでしょう?
すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2006-10-30 21:56
finally句は例外が発生しても必ず実行されると言うことで、
returnされずにメソッドが終わる事のないようにという考えで書いたのですが…。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-10-30 22:02
finallyブロックはcatchブロック内のthrowの後にも動くブロックです。
つまり、throwの後にreturnしているわけで、矛盾しているわけです。
ただし、tryの場合は正常なので警告なわけです。
すひろ
大ベテラン
会議室デビュー日: 2006/10/17
投稿数: 124
お住まい・勤務地: 愛知県
投稿日時: 2006-10-30 22:12
そういうことでしたか。ありがとうございます。

では、

  }catch( Exception e ){
     System.out.println( "ERROR [ " + e.getMessage() + " ]" );
     e.printStackTrace();
     throw e;
  }finally{
  }
  return true;
}

と書けばいいと言うことですか。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-10-30 22:26
いや、それならfinallyは不要です。
1ステップいくらという単位でお金をもらう仕事じゃなければ、無駄なのでやめましょう。

例えば、
コード:
クローズしなければいけない型 xxx = 何かしらのインスタンス;

try{
    xxx.例外が発生しそうなメソッド();
}catch(何かしらの例外 e){
    例外を何かしらする処理
    throw e;
}finally{
    xxx.クローズ処理();
}


みたいに使います。
これなら、例外が発生しそうなメソッドを実行して、
例外が発生してもしなくても、クローズ処理ができるわけです。
権兵衛
ベテラン
会議室デビュー日: 2002/09/24
投稿数: 50
投稿日時: 2006-10-31 00:08
ちなみに、finallyの中にreturnを書くと、どんな例外が発生してもfinallyの中のreturnの結果が返り、例外は完全に握りつぶせます。
たぶん、Errorも握りつぶせると思います。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-10-31 01:00
ちなみに、finallyの中にreturnを書くと、どんな値を返してもfinallyの中のreturnの結果が返り、元のreturn値は完全に握りつぶせます。

トリビアにはなるかもしれませんが、そんなことしちゃいけません。

スキルアップ/キャリアアップ(JOB@IT)