Air mata dan rasa sakit

Kesalahan dapat terjadi saat menjalankan program Java. Saat bekerja dengan database, kesalahan akan terjadi. Ini semua tentang yang mana yang dapat Anda prediksi dan tawarkan solusi yang memadai.

Grup kesalahan besar pertama akan menunggu Anda saat menjalankan baris ini:

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");

Apa yang bisa Anda harapkan di sini?

Kesalahan 1. Driver tidak ditemukan .

Jika Anda mendapatkan kesalahan “Tidak ada driver yang cocok ditemukan untuk …” , itu berarti DriverManager tidak dapat memahami jenis DBMS apa yang ada di belakang URL Anda. Misalnya, Anda menulis jdbc_mysql: alih-alih jdbc:mysql:

Kesalahan 2. Kesalahan koneksi .

Jika Anda membuat kesalahan dalam nama host, kemungkinan besar Anda akan mendapatkan pesan seperti "Tidak ada host yang dikenal" atau "Kegagalan tautan komunikasi".

Error 3. Nama database salah .

Jika Anda salah mengeja nama basis data atau menyambung ke server lain yang tidak ada, Anda akan mendapatkan pesan seperti “Database tidak dikenal 'supershop3'” .

Kesalahan 4. Login atau kata sandi salah .

Jika Anda lupa kata sandi basis data atau salah memasukkannya, kemungkinan besar Anda akan menerima pesan seperti "Akses ditolak untuk pengguna 'root'@'localhost' (menggunakan kata sandi: YA)" .

Pengecualian SQL

Jika koneksi ke pangkalan tetap terjalin, maka akan lebih menarik lagi. Jika terjadi kesalahan saat bekerja dengan database, JDBC memiliki pengecualian khusus - java.sql.SQLException . Serta beberapa varietasnya.

Pengecualian ini hanya memiliki satu metode tambahan (dibandingkan dengan kelas Pengecualian) - metode getSQLState(), yang mengembalikan kode status (string) yang dikembalikan oleh server SQL. Penanganan kesalahan terlihat seperti ini:

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");
try {
   int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
  // If table doesn't exist
   if (ex.getSQLState().compareTo("X0Y32") != 0) {
  	throw ex;
  }
 } finally {
  connection.close();
 }

Ada ratusan kode kesalahan. Anda dapat melihat daftar lengkapnya di sini .

Namun terkadang kode kesalahan membantu JDBC memahami kesalahan dengan lebih baik dan kemudian tidak hanya melempar SQLException, tetapi juga SQLException khusus:

BatchUpdateException Kesalahan selama permintaan grup
Pemotongan Data Sering terjadi saat memotong data yang panjang
SQLClientInfoException Klien melewati parameter yang tidak dapat diatur pada sambungan: Sambungan
SQLDataException Kesalahan dengan data, detail tergantung pada jenis DBMS
SQLException Kesalahan akses basis data atau kesalahan umum lainnya
SQLFeatureNotSupportedException DBMS tidak mendukung fungsi ini
SQLIntegrityConstraintViolationException Semua kesalahan dengan untuk SQLState ==22
SQLInvalidAuthorizationSpecException Kesalahan akses dan/atau otorisasi
SQLNonTransientConnectionException Semua kesalahan dengan untuk SQLState ==08
SQLRecoverableException Ada kesalahan, tapi bisa diperbaiki dengan campur tangan aplikasi
SQLSyntaxErrorException Kesalahan dalam sintaks kueri
SQLTimeoutException Permintaan terlalu lama
SQLTransactionRollbackException Kesalahan selama pengembalian transaksi
Peringatan SQL Peringatan yang dikeluarkan oleh DBMS

Contoh kesalahan

Jika terjadi error pada tahap aplikasi server, maka biasanya hanya bisa di-log dan kemudian ditangani lebih detail. Tetapi jika itu terjadi saat aplikasi sedang berjalan di komputer pemrogram, maka Anda perlu menyelidiki alasannya dengan cermat.

Ada dua kelas kesalahan terbesar saat bekerja dengan database:

  • Pesan kesalahan teks
  • Galat saat bekerja dengan ResultSet

Kesalahan dalam teks permintaan dapat terjadi sangat sering. Kueri bisa sangat panjang, berisi beberapa tabel (bergabung melalui GABUNG) dan subkueri (SUBSELECT). Tidak mudah menemukan kesalahan dalam permintaan semacam itu. Selain itu, permintaan sering direkatkan dari bagian-bagian, data ditambahkan di sana.

Kesalahan pertama yang harus Anda waspadai adalah SQLSyntaxErrorException . Kesalahan seperti itu biasanya berarti Anda salah ketik di badan permintaan.

Mari kita ambil contoh favorit kita:

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
    int count = results.getInt(1);

Dan "secara tidak sengaja" menghapus tanda bintang di badan permintaan:

ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
    int count = results.getInt(1);

Maka kita akan mendapatkan pengecualian:

Exception in thread "main" java.sql.SQLSyntaxErrorException:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1

           	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)

SQL server memberi tahu kita bahwa ada kesalahan sintaksis sebelum FROM.

Kami hati-hati melihat permintaan dan berpikir. Jika tidak ada yang terlintas dalam pikiran, dan ini sangat sering terjadi, maka Anda perlu meminta seseorang untuk melihat apa yang salah.

Kesalahan populer lainnya adalah pekerjaan yang salah dengan ResultSet - hasil permintaan. Misalkan Anda lupa bahwa sebelum membaca data, "baris saat ini" dari objek ResultSet muncul sebelum baris pertama, maka Anda akan memiliki kode berikut:

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
//    results.next();
    int count = results.getInt(1);

Anda akan mendapatkan kesalahan ini:


2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)

Kami hati-hati melihat kesalahan dan berpikir. Kemudian kami mencari di Google dan menemukan beberapa contoh dan mencoba memahami solusinya.