从历史上看,我总是这样编写我的异常处理代码:
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();
}
在 try-catch-finally block 之外对游标(jdbc 句柄等)进行赋值是否错误?
除非 JVM 实际上在赋值时崩溃,或者在赋值和 try block 中任何内容的第一行之间我不确定我的旧风格是否提供了任何额外的值(value),而第二行肯定更具可读性简洁。文献generally不过总是选择第一种风格。
编辑 - 假设我很高兴在初始化游标时 openCursor 抛出的任何异常不会被这段代码捕获,我对此示例唯一关心的是关闭游标,如果它 < strong>被分配并打开。另外假设我正在测试空值等等......等等...... yadda ... yadda ...(我已经改变了这个例子来反射(reflect)这一点,这不是我的问题的重点所以我没有包含在第一个版本中)
最佳答案
我总是采用第二种方式,因为它允许我将光标设置为 final
。如果您实际上没有尝试从中捕获异常,我没有理由认为在 try 子句中进行赋值。
编辑:请注意,根据正在进行的进一步讨论。这就是我处理 openCursor
调用抛出异常的方式:
try
{
// ALLOCATE RESOURCE
final Cursor cursor = db.openCursor(null, null);
try
{
// USE RESOURCE
}
finally
{
// DISPOSE RESOURCE
cursor.close();
}
}
catch(OpenCursorException e)
{
// Handle this appropriately.
}
注意分配、使用和处置的清晰分离。唯一有点有趣的是,如果使用 try
block 抛出与您为分配 try
block 捕获的相同的异常。 (IOException
将是一个特别好的例子,因为打开和读取都可以抛出一个异常。)在这种情况下,一切仍将正确清理和处理,但您可能错误地将失败归因于初始化异常而不是使用异常。在这种情况下,您需要在内部 try
block 中捕获异常并立即在其中处理它们。
关于Java 异常处理 - 风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909662/