try {
doAction();
} catch(Exception e) {
log.error(e,e);
throw e;
} finally {
doEnd();
}
是java中比较常见的编码方法。
但是在实际的编码过程中发现一些程序员并不能很好的理解这个语句的执行流程。从而产生一些不是很恰当的写法。
比如最常见的jdbc的事物管理中,牵涉到中途return,画面迁移的情况下面的一些例子。
一般写法
trn.open(); //打开连接
try {
doAction();
trn.commit(); //事务提交
} catch(Exception e) {
trn.rollback(); //事务回滚
log.error(e,e);
throw e;
} finally {
trn.close(); //关闭连接
}
不好的写法1:中途return的时候
trn.open();
try {
boolean flag = doAction1();
if (!flag) {
return;
}
trn.commit();
} catch(Exception e) {
log.error(e,e);
throw e;
}
没有finally语句,中途return的时候就不会释放连接资源。
不好的写法2:画面迁移
trn.open(); //打开连接
try {
boolean flag = doAction();
if (!flag) {
trn.close(); //迁移前关闭资源
mapping.findForward("tonextpage");//画面迁移
}
doActon2();
trn.commit(); //事务提交
} catch(Exception e) {
trn.rollback(); //事务回滚
log.error(e,e);
throw e;
} finally {
trn.close(); //关闭连接
}
在画面迁移前专门写了关闭资源的处理。
等等,很多种写法我都遇到过,其实说到底就是对finally理解不到位。
即使画面迁移,中途return等等,只要有finally语句,最后都会执行finally语句的。