Ko'z yoshlar va og'riq
Java dasturlari bajarilganda xatolar yuzaga kelishi mumkin. Ma'lumotlar bazasi bilan ishlashda xatolar bo'ladi. Asosiy masala, qanday xatolarni oldindan sezib, ularga munosib echimlar taqdim etishingiz mumkinligida.
Birinchi katta xatolar guruhi sizni quyidagi qatorni bajarishda kutadi:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
Bu yerda sizni nima kutishi mumkin?
Xato 1. Draiver topilmadi.
Agar siz “No suitable driver found for …” xatosini olgan bo'lsangiz, demak DriverManager sizning URL dan qanday SGBD turini yashiringanini anglay olmadi. Masalan, siz jdbc:mysql: o'rniga jdbc_mysql: yozgan bo'lishingiz mumkin.
Xato 2. Ulanish xatosi.
Agar siz host nomida xato qilsangiz, ehtimol “No such host is known” yoki “Communications link failure” ga o'xshash xabar olasiz.
Xato 3. Bazaga noto'g'ri nom ko'rsatilgan.
Agar bazaning nomida xatolik qilgan bo'lsangiz yoki boshqa servisga ulansangiz, ehtimol “Unknown database 'supershop3'” ga o'xshash xabar olasiz.
Xato 4. Noto'g'ri login yoki parol.
Agar bazaning parolini unutgan bo'lsangiz yoki noto'g'ri kiritsangiz, ehtimol “Access denied for user 'root'@'localhost' (using password: YES)” ga o'xshash xabar olasiz.
SQL Exception
Agar ma'lumotlar bazasi bilan ulanish amalga oshsa, unda qiziqarli bo'ladi. JDBC da ma'lumotlar bilan ishlashda yuzaga keladigan xatolar uchun maxsus istisnolar mavjud – java.sql.SQLException. Va uning bir qancha turlari mavjud.
Bu istisnoda faqat bir qo'shimcha metod mavjud (Exception klassi bilan solishtirganda) – bu getSQLState() metodi, bu SQL server tomonidan qaytarilgan holat kodini (satr) qaytaradi. Xatolarga ishlov berish quyidagicha ko'rinadi:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
try {
int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
// Agar jadval mavjud emas bo'lsa
if (ex.getSQLState().compareTo("X0Y32") != 0) {
throw ex;
}
} finally {
connection.close();
}
Kodlar soni bir necha yuz. To'liq ro'yxatni bu yerda ko'rishingiz mumkin.
Lekin ba'zida xato kodlari JDBC ga xatoni yaxshiroq tushunishga yordam beradi va unda u faqat SQLException emas, balki maxsus SQLException yaratadi:
| BatchUpdateException | Guruhlash so'rovida xato |
| DataTruncation | Ko'pincha uzun ma'lumotlarni kesishda yuzaga keladi |
| SQLClientInfoException | Client ulanishda o'rnatilmaydigan parametlarni uzatdi: Connection |
| SQLDataException | Ma'lumot xatosi, tafsilotlar SGBD turiga bog'liq |
| SQLException | Bazaga kirish yoki boshqa umumiy xatolar |
| SQLFeatureNotSupportedException | SGBD bu funktsionallikni qo'llab-quvvatlamaydi |
| SQLIntegrityConstraintViolationException | SQLState ==22 uchun barcha xatolar |
| SQLInvalidAuthorizationSpecException | Kirish va/yoki avtorizatsiya xatosi |
| SQLNonTransientConnectionException | SQLState ==08 uchun barcha xatolar |
| SQLRecoverableException | Xato mavjud, lekin uni application aralashuvi bilan tuzatish mumkin |
| SQLSyntaxErrorException | So'rov sintaksisida xato |
| SQLTimeoutException | So'rov juda uzoq davom etdi |
| SQLTransactionRollbackException | Tranzaksiya orqaga qaytarilishi vaqtidagi xato |
| SQLWarning | SGBD yuborgan ogohlantirish |
Xato misollar
Agar xato server dasturi ishlayotgan vaqtda yuzaga kelsa, odatda uni logga yozib qo'yish va keyinchalik batafsil tekshirish mumkin. Ammo agar u dasturchining kompyuterida turgan vaqtda bo'lsa, sababini diqqat bilan o'rganishingiz kerak.
Ma'lumotlar bazasi bilan ishlashda ikki xil katta xato sinflari mavjud:
- So'rovda xato
- ResultSet bilan ishlashda xato
So'rovda xato juda tez-tez yuzaga kelishi mumkin. So'rov juda uzun bo'lishi, bir necha jadvalni (JOIN orqali birlashtirilgan) va subystallik (SUBSELECT) bo'lishi mumkin. Bunday so'rovda xatoni topish qiyin. Bundan tashqari, so'rovlar ko'pincha qismlardan yig'iladi va ularga ma'lumot qo'shiladi.
Siz bilishingiz kerak bo'lgan birinchi xato — bu SQLSyntaxErrorException. Bunday xato odatda so'rov matnida xatolik borligini anglatadi.
Sevimli misolimizni olaylik:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
Va so'rov matnidagi yulduzni "tasodifan" o'chirib tashlaymiz:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
Shunda biz quyidagi xatoga duch kelamiz:
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 bizga FROM oldida sintaksis xatosi borligini yozmoqda.
So'rovni diqqat bilan ko'rib chiqing va o'ylang. Agar hech narsa xayolingizga kelmasa, bunday holatlar juda ko'p bo'ladi, biror kishidan nima noto'g'ri ekanligini ko'rib chiqishni so'rang.
Yana bir mashhur xato — bu ResultSet bilan noto'g'ri ishlash — so'rov natijasi. Tasavvur qiling, siz ResultSet ob'yektining "jory satri" birinchi satrdan oldin turishini unutdingiz, shunda sizda quyidagi kod bo'ladi:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Siz quyidagi xatoni olasiz:
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)
Xatoni diqqat bilan ko'rib chiqing va o'ylang. Keyin googllang va bir nechta misollarni toping va echimni tushunishga harakat qiling.
GO TO FULL VERSION