我有一个单独的连接器对象,可以帮助连接到mysql数据库。
public class Connector{
private Connector(){
}
public static Connector getInstance(){
if(unique == null) unique = new Connector();
return unique;
}
public void connect() throws SQLException{
conn = (Connection) DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
if(conn != null) System.out.println("Connected");
}
public void close() throws SQLException{
if(conn != null) conn.close();
}
}
但很自然地,我正在冒充调用者处理的异常。这是我的主叫客户。
Connector connector = Connector.getInstance();
try {
connector.connect();
} catch (SQLException e) {
System.out.println("Connected now");
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
connector.close();
System.out.println("Connection closed");
}
现在连接器没有编译,因为它希望我将finally包装在try catch中,因为方法close()
也会引发异常。这意味着我必须编写类似的代码。
finally {
try {
connector.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Connection closed");
}
这在某种程度上看起来并不合适。什么是处理这种情况的正确方法。感谢您的期待。
答案 0 :(得分:3)
使用decorator pattern处理this。您可以更改Connector
类以实现AutoCloseable
(只有一个方法:public void close()
)并确保没有抛出异常。然后,您可以在使用Connector
时使用try-with-resources。
答案 1 :(得分:2)
您可以隐藏异常并使用close
类的Connector
方法上的布尔值更改它
public boolean close() {
try
{
if(conn != null) conn.close();
return true;
}
catch (Exception ex)
{
return false;
}
}
答案 2 :(得分:1)
许多图书馆可以安静地关闭Closeables(番石榴,阿帕奇)。
使用番石榴,您可以这样做:
Closeables.closeQuietly(something);
它在try-catch块中调用close()但看起来更好。 它还会检查您的Closeable是否为空,因此您不必担心这一点。