从历史上我一直写下我的异常处理代码:
Cursor cursor = null; try { cursor = db.openCursor(null,null); // do stuff } finally { if (cursor != null) cursor.close(); }
但最近,由于可读性和懒惰的原因,我已经开始这样做了:
Cursor cursor = db.openCursor(null,null); try { // do stuff } finally { cursor.close(); }
我的错误是将游标(jdbc handle,whatever)分配给try-catch-finally块吗?
除了JVM实际上在作业上,或任务和第一行之间的任何东西在尝试块我不知道我的旧风格是否借出任何额外的价值,而第二个肯定更可读和简明扼要.文学generally总是与第一风格一起去.
编辑 – 假设我很高兴openCursor抛出的任何异常,而初始化游标不被捕获在这个代码块中,我唯一关心的是这个例子是关闭游标,如果它被分配&打开.还假设我正在测试nulls等..等.. yadda … yadda …(我已经改变了例子来反映这一点,这不是我的问题的焦点,所以我没有把它包括在第一版)
解决方法
如果所有你最后都在做的是关闭光标,那么第二种形式是正确的.如果openCursor()失败,您将永远不会有关闭的游标.该变量的值甚至不会被设置.
正如其他人所暗示的,注意事项是,如果您正在进行额外的初始化,需要自己清理,那么逻辑上必须进入finally {}并相应地更改范围.虽然我认为在这种情况下进行重组.
底线:写的第一个版本是不必要的复杂.第二个版本是正确的.
编辑:结合我的其他评论为后代…
第一个例子似乎是无害的,因为它所做的只是添加一堆不必要的代码. (完全不需要,如果不清楚)然而,在经典的“更多的代码意味着更多的潜在的错误”的时尚,有一个隐藏的骗子.
如果由于某些原因“//做某事”代码无意中清除了游标变量,那么您将默认泄漏游标,而在您至少得到NullPointerException之前.由于额外的代码绝对没有用处,因此额外的风险是完全不必要的.