正确处理Java中的异常的方法

时间:2016-04-08 13:37:23

标签: java jdbc

我有一个单独的连接器对象,可以帮助连接到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");
        }

这在某种程度上看起来并不合适。什么是处理这种情况的正确方法。感谢您的期待。

3 个答案:

答案 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是否为空,因此您不必担心这一点。