2016-04-08 59 views
3

我有一個單連接器連接器對象,可以幫助連接到mysql數據庫。在Java中處理異常的正確方法

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"); 
     } 

連接器不能編譯,因爲它要我包裹終於嘗試捕捉範圍內,因爲該方法close()也會引發異常。這意味着我必須編寫這樣的代碼。

finally { 
      try { 
       connector.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("Connection closed"); 
     } 

這不知怎的看起來不對。處理這種情況的正確方法是什麼?感謝預期。

+2

有沒有「正確」的方式,這一切都取決於您的需求和要求 – Stultuske

+0

@Stultuske所以這段代碼是好的還是有一個更優雅的方式來處理這個異常。 – Zeus

+0

你實際上在很多庫中最終會找到這樣的塊,有時候會用一個方法來包裝Apache Commons IOUtils的closeQuietly(...)這樣的內部try-catch。 – Thomas

回答

3

close方法使用decorator pattern處理this。您可以更改Connector類來實現AutoCloseable(它只有一個方法:public void close()),並確保沒有拋出異常。然後,在使用Connector時,您可以使用try-with-resources

+0

這假定java> 6,否則我會建議我自己的解決方案。 – trappski

+0

@trappski確實如此,但我發現嘗試使用資源比以前的方式更優雅,並且有助於資源管理,我無法自拔。 – callyalater

2

可以隱藏異常,並用布爾改變它的Connector

public boolean close() { 
    try 
    { 
     if(conn != null) conn.close(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
    return false; 
    } 
} 
+1

我不確定我是否理解這一點。你能提供一個代碼片段嗎? – Zeus

+0

你的意思是不能或者可以嗎? – Zeus

+0

可以,對不起這個錯誤... – Plebios

1

很多圖書館可以靜靜關閉Closeables(番石榴,apache)。

隨着番石榴,你會做這樣的事情:

Closeables.closeQuietly(something); 

它try-catch塊中調用close(),但只是看起來更好。 它還檢查您的Closeable是否爲null,因此您不必擔心這一點。