我是Java初学者,但我认为在使用try-catch-finally时我不必使用throws SQLException
声明异常。但是,如果我不使用它,编译器会给我错误:
“未报告的异常java.sql.SQLException;必须被捕获或声明被抛出”。
我包含了一个catch,所以我不确定为什么会出现这种错误。
public static ResultSet getResultSet ( String query )
{
dbConn = getConnection();
try
{
stmt = dbConn.createStatement( );
ResultSet rs = stmt.executeQuery( query );
return rs;
}
catch (SQLException ex)
{
return null;
}
finally
{
stmt.close();
dbConn.close();
}
}
答案 0 :(得分:9)
这是因为close()
方法:
stmt.close();
dbConn.close();
可能会抛出SQLException
并且您没有将它们封装在try / catch块中。
一个方法很可能会在finally子句中抛出异常,并且在没有catch-clause处理这些异常的情况下,必须声明该方法抛出这些异常。
基本上,你需要做一些像
这样的事情finally
{
try {
stmt.close();
} catch (SQLException sqle) {
// log the statement-close exception
}
try {
dbConn.close();
} catch (SQLException sqle) {
// log the connection-close exception
}
}
答案 1 :(得分:4)
将dbConn = getConnection();
放入try
部分。 It can throw an SQLException
too.
答案 2 :(得分:2)
除编译器错误外,此代码在运行时也会失败。
当您关闭创建Connection
的{{1}}时,ResultSet
将无效,并且对其进行的任何调用都将失败。 (当然,要实现一些奇怪的JDBC驱动程序,以便这可以工作,但这是对JDBC API的错误使用。)
ResultSet
的范围和有效期不能超过其父ResultSet
和Connection
。
答案 3 :(得分:0)
您编写的代码使用的类具有必须处理的异常类型。您可以通过以下两种方式中的一种方式执行此操作:将其传递给链,即重新抛出异常,或者通过将close方法放在最终自己的try catch中来实际处理它。块。
通常,您会在文件IO类中看到这些内容,您应始终关闭对象或流以确保将其保留为有效状态。否则,您将把它留给操作系统为您清理。