在finally {}中捕获异常?必须?

时间:2010-09-09 04:48:38

标签: java jsp

我觉得很难......

我在.jsp中写了一个小例程。最后,ResultSetStatementConnection需要关闭。我还在finally { }中写了结束代码,但是当页面运行时,它返回错误,我没有捕获异常......

我读了一些论坛。其他人在finally { }

中没有发现任何例外情况

任何提示?

6 个答案:

答案 0 :(得分:3)

您必须在代码finally块中捕获异常。因为您必须在catch块中捕获异常。嵌套的try/catch es是常规的东西(尽管很丑陋)。

这里的一个重要注意事项是,您可以获得在方法的throws子句中最终声明的异常。然而,这将导致最终覆盖原始异常的异常,原始异常将丢失。例如,您会看到NullPointerException,而不是FileNotFoundException

顺便说一下,避免在JSP文件中使用代码。将它放在servlet中。

答案 1 :(得分:3)

听起来你有一个老问题,需要在finally块中关闭()但close()会抛出异常本身。尝试类似以下的内容......

ResultSet rs;

try {
    // do various stuff
    rs = ...;

} finally {
    try {
        if (rs != null) rs.close();

    } catch (SQLException e) {
        // do something with exception
    } 
}

答案 2 :(得分:2)

终于{}没有做任何异常捕获。存在finally {}块以确保运行某些代码,无论try {}块是否达到其自然结束,或者它是否暂时跳转到finally {},因为发生了异常并且最后{}块是沿着办法。但是在终于{}完成之后,例外就是它的快乐业务,它在堆栈中飙升并且高兴地崩溃你的程序。

如果要实际捕获异常并阻止它进一步展开堆栈,请使用catch(){}。但是不要盲目地使用catch - 捕获异常,你实际上并不知道如何恢复比崩溃更糟糕,因为现在你的程序运行不正常并且没有异常堆栈跟踪告诉你原因。

您的ResultSet,Statement和Connection几乎肯定会被关闭。然后,异常继续发生并且无论如何都会破坏您的程序,因为这与您的ResultSet,Statement和Connection无关。

实际的例外是什么?

答案 3 :(得分:2)

也许我已经老了,但是在catch区块中捕获异常有什么问题?

答案 4 :(得分:0)

如果您说出try块中的内容,这会有所帮助。你可能没有捕获适当的异常或你的代码终于抛出异常。

最后没有捕获也没关系。

try {
 //do some work
}  

finally {
 //check of state and do clean up. You would have reached here via multiple branches. 
}

使用catch捕获特定异常更合适,然后在那里处理特定的清理。最后使用即使发生异常也必须执行的任何代码。

try {
   //do some work
}  
catch ( RecoverableException1 re1) {
   //cleanup
}
catch ( RecoverableException2 re2) {
   //cleanup
}

finally {
   //check of state and do clean up. You would have reached here via multiple branches.
}

答案 5 :(得分:-1)

最后{  尝试{    resultSet.close();  } catch(E e){  }最后{    尝试{      将statement.close();    } catch(E e){    }最后{      conn.close();    }  }

}