JDBC異常處理
異常處理,可以處理在一個受控製的方式異常情況,如程序定義的錯誤。
當異常情況發生時,將引發異常。拋出這個詞意味著當前執行的程序停止,並控製被重定向到最近的適用的catch子句。如果冇有適用 catch 子句存在,那麼程序的執行結束。
JDBC的異常處理非常類似於Java Excpetion處理,但對於JDBC,最常見的異常處理的是 java.sql.SQLException.
SQLException 方法:
SqlException異常可以在驅動程序和數據庫出現在這兩種。當出現這樣的異常時,拋出:SQLException類型的對象將被傳遞到catch子句。
傳遞的SQLException對象具有可用於檢索有關異常的附加信息下麵的方法:
方法 | 描述 |
---|---|
getErrorCode( ) | 獲取與異常關聯的錯誤號。 |
getMessage( ) | 獲取JDBC驅動程序的錯誤消息由驅動程序處理錯誤或獲取Oracle錯誤號和消息的一個數據庫錯誤。 |
getSQLState( ) | 獲取XOPEN SQLSTATE字符串。對於JDBC驅動程序的錯誤,冇有有用的信息從該方法返回。對於一個數據庫錯誤,則返回五位XOPEN SQLSTATE代碼。這種方法可以返回null。 |
getNextException( ) | 獲取異常鏈的下一個Exception對象。 |
printStackTrace( ) | 打印當前的異常,或者拋出,其回溯到標準錯誤流。 |
printStackTrace(PrintStream s) | 打印此拋出,其回溯到指定的打印流。 |
printStackTrace(PrintWriter w) | 打印此拋出,其回溯到指定的打印寫入。 |
通過利用可從Exception對象捕獲異常的信息,並適當地繼續運行程序。這裡是一個try塊的一般形式為:
try { // Your risky code goes between these curly braces!!! } catch(Exception ex) { // Your exception handling code goes between these // curly braces, similar to the exception clause // in a PL/SQL block. } finally { // Your must-always-be-executed code goes between these // curly braces. Like closing database connection. }
例如:
學習下麵的代碼示例來了解試試 try....catch...finally 塊的使用。
//STEP 1. Import required packages import java.sql.*; public class JDBCExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; try{ //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Execute a query System.out.println("Creating statement..."); Statement stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); //STEP 5: Extract data from result set while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); }catch(Exception e){ //Handle errors for Class.forName e.printStackTrace(); }finally{ //finally block used to close resources try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); }//end main }//end JDBCExample
現在讓我們來編譯上麵的例子如下:
C:>javac JDBCExample.java C:>
當運行JDBCExample,如果冇有問題它會產生以下結果,否則相應的錯誤將被捕獲並會顯示錯誤消息:
C:>java JDBCExample Connecting to database... Creating statement... ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal C:>
試試上麵的例子中通過傳遞錯誤的數據庫名稱或錯誤的用戶名或密碼,並檢查結果。