2010-08-11 81 views
0

我是Java初學者,但我認爲在使用try-catch-finally時,我不必使用throws SQLException來聲明異常。但是,如果我不使用它的編譯器給我的錯誤:try-catch-finally在Java中拋出異常問題

"unreported exception java.sql.SQLException; must be caught or declare to be thrown".

我包括一個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(); 
    } 
} 
+5

幫助,很多小貓死亡。您已將'dbConn'和'stmt'聲明爲'static'。這段代碼絕對不是線程安全的。我強烈建議重做基本的Java和JDBC教程。 – BalusC 2010-08-11 18:48:11

+1

當您使用ResultSet時,您也將獲得'SQLExceptions',因此您不妨傳播異常。連接關閉後,ResultSet可能不起作用。你可能想考慮執行周圍的習語。 http://stackoverflow.com/questions/341971/what-is-the-execute-around-idiom – 2010-08-11 19:10:46

+1

FWIW:* normal *練習是將ResultSet映射到'List '並返回。對於某些示例,[head here](http://stackoverflow.com/questions/3148092/java-jdbc-mysql-connector-how-to-resolve-disconnection-after-a-long-idle-time/3148857#3148857 )和[這裏](http://stackoverflow.com/questions/1813858/sqlite-3-jdbc-driver-throws-resultsset-closed-exception-on-empty-resultset/1814443#1814443)。 – BalusC 2010-08-11 19:14:03

回答

9

這是因爲close()方法:

stmt.close(); 
dbConn.close(); 

可能拋出SQLException,你有沒有在try/catch塊封裝它們。

一個方法可能很好地從finally子句中拋出異常,並且在沒有catch子句處理這些異常的情況下,該方法必須聲明爲拋出這些異常。

基本上,你需要做的是這樣

finally 
{ 
    try { 
     stmt.close(); 
    } catch (SQLException sqle) { 
     // log the statement-close exception 
    } 

    try { 
     dbConn.close(); 
    } catch (SQLException sqle) { 
     // log the connection-close exception 
    } 
} 
+2

不,基本上你需要把每個'close()'放在它自己的** try-catch中,這是記錄或忽略異常。 close()'拋出,那麼'dbConn.close()'永遠不會發生 – BalusC 2010-08-11 18:52:38

+0

啊,好點,我會更新:) – aioobe 2010-08-11 18:54:06

+2

你可能想要添加nullcheck。 – BalusC 2010-08-11 19:12:02

4

try節將dbConn = getConnection();It can throw an SQLException too.

+0

這似乎是另一種本土靜態方法。他可能已經在方法內部抑制了這個異常(這確實是一個壞主意btw)。 – BalusC 2010-08-11 18:54:43

2

除了編譯器錯誤,這段代碼在運行時會失敗。

當您關閉從中創建ResultSetConnection時,ResultSet將失效,並且其上的任何調用都將失敗。 (當然,有些奇怪的JDBC驅動程序實現,使這可能是工作,但這是JDBC API的不正確使用。)

範圍和ResultSet的壽命可不會比其父ConnectionStatement寬。

0

您編寫的代碼使用具有必須處理的異常類型的類。你可以通過以下兩種方式之一來做到這一點:將它傳遞給鏈,即重新拋出異常,或者通過實際處理它,如其他一些註釋所示,通過將close方法放在最後的try catch中塊。

通常,您將在文件IO類中看到這些內容,您應該始終關閉對象或流以確保將其保留在有效狀態。否則,您將把它留給操作系統來爲您清理。