CodeGym/Java курс/All lectures for BG purposes/Справяне с грешки

Справяне с грешки

На разположение

Сълзи и болка

Възможно е да възникнат грешки при изпълнение на Java програма. При работа с базата данни ще възникнат грешки. Всичко е до това кой от тях можете да предвидите и да предложите адекватно решение.

Първата голяма група грешки ще ви очаква при изпълнение на този ред:

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

Какво можете да очаквате тук?

Грешка 1. Драйверът не е намерен .

Ако получите грешката „Няма намерен подходящ драйвер за …“ , това означава, че DriverManager не може да разбере Howъв тип СУБД стои зад вашия URL. Например сте написали jdbc_mysql: instead of jdbc:mysql:

Грешка 2. Грешка при свързване .

Ако направите грешка в името на хоста, най-вероятно ще получите съобщение като „Не е известен такъв хост“ or „Неуспех на комуникационната връзка“.

Грешка 3. Името на базата данни е неправилно .

Ако сте написали грешно името на базата данни or сте се свързали с друг сървър, където тя не съществува, ще получите съобщение като „Неизвестна база данни 'supershop3'” .

Грешка 4. Грешно потребителско име or парола .

Ако сте забравor паролата на базата данни or сте я въвели неправилно, тогава най-вероятно ще получите съобщение като „Отказан достъп за потребител 'root'@'localhost' (използване на парола: ДА)” .

SQL изключение

Ако връзката с базата все пак е установена, тогава ще бъде по-интересно по-нататък. В случай на грешки при работа с базата данни, JDBC има специално изключение - java.sql.SQLException . Както и няколко негови разновидности.

Това изключение има само един допълнителен метод (в сравнение с класа Exception) - методът getSQLState(), който връща codeа на състоянието (низ), който SQL сървърът му е върнал. Обработката на грешки изглежда така:

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();
 }

Има стотици codeове за грешки. Можете да видите пълния списък тук .

Но понякога codeовете за грешки помагат на JDBC да разбере по-добре грешката и след това хвърля не само SQLException, но специализирано SQLException:

BatchUpdateException Грешка при групова заявка
DataTruncation Често се случва при съкращаване на дълги данни
SQLClientInfoException Клиентът предаде параметри, които не могат да бъдат зададени на връзката: Връзка
SQLDataException Грешка с данни, подробностите зависят от типа на СУБД
SQLException Грешка при достъп до база данни or други общи грешки
SQLFeatureNotSupportedException СУБД не поддържа тази функционалност
SQLIntegrityConstraintViolationException Всички грешки с за SQLState ==22
SQLInvalidAuthorizationSpecException Грешка при достъп и/or оторизация
SQLNonTransientConnectionException Всички грешки с за SQLState ==08
SQLRecoverableException Има грешка, но тя може да бъде попequalsа с намесата на приложението
SQLSyntaxErrorException Грешка в синтаксиса на заявката
SQLTimeoutException Заявката отне твърде много време
SQLTransactionRollbackException Грешка по време на връщане назад на транзакция
SQLПредупреждение Предупреждение, издадено от СУБД

Примери за грешки

Ако възникне грешка на етапа на сървърното приложение, обикновено тя може да бъде регистрирана и след това да бъде разгледана по-подробно. Но ако това се случи, докато приложението работи на компютъра на програмиста, тогава трябва внимателно да проучите причината за това.

Има два най-големи класа грешки при работа с база данни:

  • Грешка в текста на заявката
  • Грешка при работа с ResultSet

Много често може да възникне грешка в текста на заявката. Заявката може да бъде много дълга, да съдържа няколко таблици (свързани чрез JOIN) и подзаявки (SUBSELECT). Не е лесно да се намери грешка в такава заявка. Освен това заявките често се слепват от части, там се добавят данни.

Първата грешка, за която трябва да знаете, е SQLSyntaxErrorException . Такава грешка обикновено означава, че имате правописна грешка в тялото на заявката.

Да вземем нашия любим пример:

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

И „случайно“ изтрийте звездичката в тялото на заявката:

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

Тогава ще получим изключение:

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 сървърът ни казва, че е имало синтактична грешка преди FROM.

Ние внимателно разглеждаме заявката и мислим. Ако нищо не ви идва наум, а това се случва много често, тогава трябва да помолите някого да погледне Howво не е наред.

Друга популярна грешка е неправилната работа с ResultSet - резултатът от заявката. Да предположим, че сте забравor, че преди да прочетете данните, „текущият ред“ на обекта ResultSet идва преди първия ред, тогава ще имате следния code:

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

Ще получите тази грешка:


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)

Ние внимателно разглеждаме грешката и мислим. След това търсим в Google и намираме няколко примера и се опитваме да разберем решението.

Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари