表題について、参考書によくわからないソースがいくつかありました。
ソースにコメントで番号をふったところです。
下記は従業員IDで従業員テーブルの従業員情報(名前、年齢等)を検索するというサンプルです。
※Javaのバージョン7です。
※importは省いています。
public class Search { public void execute(HttpServletRequest request) throws SQLException { //コントローラから最初に呼びだされるメソッド BeanDaoTest daoTest = null; String empId = request.getParameter("paramId"); try { EmpBean empBean = daoTest.getEmpData(Integer.parseInt(empId)); //省略(結果のempBeanをsetAttribute()したり、該当する従業員がいないエラーだしたり。) } finally { if (daoTest != null) { daoTest.close(); //③ } } } } public class BeanDaoTest { private Connection connection; public BeanDaoTest() throws SQLException { String url = ○○; String user = ○○; String password = ○○; connection = DriverManager.getConnection(url, user, password); } public void close() { try { if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } public EmpBean getEmpData(int empId) throws SQLException { EmpBean bean = null; PreparedStatement pstatement = null; ResultSet result = null; try { //省略(SQL実行、結果取得) if (result.next()) { bean = new EmpBean(); //セッターゲッターのクラス //省略(beanに結果セット) } } finally { result.close(); //② pstatement.close(); //① } return bean; } }
①getEmpData()のfinally句でPreparedStatementオブジェクトのclose時、null判定をしないといけないと思うのですが、間違いないですか?
もしPreparedStatementオブジェクトの生成前に例外が発生した場合、NullPointerExceptionが発生してしまうという認識です。
②ResultSetオブジェクトのclose時も、このソースの場合はnull判定必要ですよね?
ResultSetオブジェクトは、結果がない場合nullではなく一行もない状態になるので、close時もnull判定はいらないそうですが、今回は最初にnullで初期化しているので、①と同じ理由で必要かと思いました。
③Connectionオブジェクトですが、このソースでは呼び出し元でcloseされています。
何か理由があるのでしょうか?
何か意図があってこうなっているようにも見えるのですが、ResultSetやPreparedStatementと同じfinally句でcloseしてはいけなかったのでしょうか?
長々と失礼致しました。回答お待ちしております。


回答1件
あなたの回答
tips
プレビュー