SQLException: Xử lý ngoại lệ trong JDBC



Ngoại lệ (Exception) là một tình trạng bất thường xảy ra trong khi thực thi chương trình và Xử lý ngoại lệ (Exception Handling) giúp bạn xử lý các điều kiện bất thường này.

Lớp SQLException trong JDBC

Trong JDBC, lớp java.sql.SQLException cung cấp rất nhiều phương thức để xử lý các ngoại lệ xảy ra cho cả Driver và Database. Đây là một trong các lớp cơ bản của JDBC, và chịu trách nhiệm về xử lý các ngoại lệ.

Khi một điều kiện bất thường xuất hiện, một Exception được ném. Khái niệm ném (thrown) ở đây nghĩa là sự thực thi chương trình hiện tại dừng lại và luồng điều khiển được chuyển tiếp tới mệnh đề catch gần nhất. Nếu không có mệnh đề catch nào, thì sự thực thi chương trình kết thúc.

Dưới đây là các phương thức của đối tượng SQLException để cung cấp thông tin về Exception:

1. public String getSQLState()

Lấy SQL State cho đối tượng SQLException này. Với một lỗi liên quan tới Driver, thì phương thức này không trả về thông tin hữu ích nào. Tuy nhiên, với một lỗi liên quan tới Database, một code gồm 5 chữ số miêu tả về XOPEN SQLstate được trả về. Phương thức này có thể trả về null.

2. public int getErrorCode()

Trả về số hiệu lỗi liên kết với Exception đó.

3. public SQLException getNextException()

Lấy đối tượng Exception tiếp theo trong Exception Chain được thiết lập bởi phương thức setNextException.

4. public void setNextException(SQLException ex)

Thêm một đối tượng SQLException tới phần cuối của Chain.

5. public Iterator iterator()

Trả về một iterator qua dãy các SQLException. Iterator này sẽ lặp qua mỗi SQLException và nguyên nhân gây ra ngoại lệ đó.

6. public void printStackTrace()

In ngoại lệ hiện tại và backtrace của nó tới luồng lỗi chuẩn (Standard Error Stream).

7. public void printStackTrace(PrintStream s)

In ngoại lệ này và backtrace của nó tới Print Stream bạn đã xác định.

Bằng việc lợi dụng thông tin từ các phương thức trên, bạn có thể bắt một Exception và tiếp tục thực thi chương trình một cách thích hợp. Dưới đây là form chung của một khối try-catch-finally:

try {
   // Phan code ma ban nghi ngo rang se xuat hien loi nen dat o day!!!
}
catch(Exception ex) {
   // Ban xu ly ngoai le tai day
}
finally {
   // Phan code nay luon duoc thuc thi
}

Ví dụ về xử lý ngoại lệ trong JDBC

Dưới đây là ví dụ minh họa cách sử dụng của khối try-catch-finally và cách sử dụng các phương thức trên để xử lý ngoại lệ.

package com.vietjack.jdbc; //Buoc 1: Ban can inport cac package can thiet
import java.sql.*;public class ViDuJDBC {
   // Ten cua driver va dia chi URL cua co so du lieu
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/sinhvien";   //  Ten nguoi dung va mat khau cua co so du lieu
   static final String USER = "root";
   static final String PASS = "123456";
   
   public static void main(String[] args) {
   Connection conn = null;
   try{
      // Buoc 2: Dang ky Driver
      Class.forName("com.mysql.jdbc.Driver");      // Buoc 3: Mo mot ket noi
      System.out.println("Dang ket noi toi co so du lieu ...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);      // Buoc 4: Thuc thi truy van
      System.out.println("Tao cac lenh truy van SQL ...");
      Statement stmt = conn.createStatement();
      String sql;
      sql = "SELECT mssv, ho, ten, diemthi FROM sinhvienk60";
      ResultSet rs = stmt.executeQuery(sql);      // Buoc 5: Lay du lieu tu Result Set
      while(rs.next()){
         // Lay du lieu boi su dung ten cot
         int mssv  = rs.getInt("mssv");
         int diemthi = rs.getInt("diemthi");
         String ho = rs.getString("ho");
         String ten = rs.getString("ten");         // Hien thi cac gia tri
       System.out.print("\nMSSV: " + mssv);
       System.out.print("\nHo: " + ho);
       System.out.println("\nTen: " + ten);
       System.out.print("\nDiem Thi: " + diemthi);
       System.out.print("\n=================");
      }
      // Buoc 6: Don sach moi truong va giai phong resource
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      // Xu ly cac loi cho JDBC
      se.printStackTrace();
   }catch(Exception e){
      // Xu ly cac loi cho Class.forName
      e.printStackTrace();
   }finally{
      // Khoi finally duoc su dung de dong cac resource
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }// Ket thuc khoi finally
   }// Ket thuc khoi try
   System.out.println("\nVietJack chuc cac ban hoc tot!");
}// Ket thuc main
}// Ket thuc ViDuJDBC

Sao chép và dán ví dụ trên trong ViDuJDBC.java, sau đó biên dịch và thực thi chương trình Java trên. Nếu không có vấn đề gì xảy ra, chương trình trên sẽ cho kết quả như sau. Nếu có bất kỳ lỗi nào, thì chương trình sẽ bắt và hiển thị thông báo tương ứng về lỗi đó.

Xử lý ngoại lệ trong JDBC

Bạn thử lại ví dụ trên bởi cung cấp sai tên database hoặc username hoặc sai password, sau đó kiểm tra kết quả. Chẳng hạn, khi mình cung cấp mật khẩu là 123455, thì khi chạy chương trình trên sẽ cho kết quả dạng:

Xử lý ngoại lệ trong JDBC

Demo một bài giảng trong khóa học online tại vietjackteam.