Radzenie sobie z błędami

Dostępny

Łzy i ból

Podczas uruchamiania programu Java mogą wystąpić błędy. Podczas pracy z bazą danych wystąpią błędy . Wszystko zależy od tego, które z nich jesteś w stanie przewidzieć i zaoferować odpowiednie rozwiązanie.

Pierwsza duża grupa błędów będzie na ciebie czekać podczas wykonywania tej linii:

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

Czego możesz się tutaj spodziewać?

Błąd 1. Nie znaleziono sterownika .

Jeśli pojawi się błąd „Nie znaleziono odpowiedniego sterownika dla…” , oznacza to, że DriverManager nie mógł zrozumieć, jaki typ DBMS znajduje się za twoim adresem URL. Na przykład napisałeś jdbc_mysql: zamiast jdbc:mysql:

Błąd 2. Błąd połączenia .

Jeśli popełnisz błąd w nazwie hosta, najprawdopodobniej otrzymasz komunikat typu „Nie jest znany żaden taki host” lub „Błąd łącza komunikacyjnego”.

Błąd 3. Nazwa bazy danych jest niepoprawna .

Jeśli źle wpiszesz nazwę bazy danych lub połączysz się z innym serwerem, na którym ona nie istnieje, otrzymasz komunikat typu „Nieznana baza danych 'supershop3'” .

Błąd 4. Zły login lub hasło .

Jeśli zapomniałeś hasła do bazy danych lub wpisałeś je niepoprawnie, najprawdopodobniej otrzymasz wiadomość typu „Odmowa dostępu dla użytkownika 'root'@'localhost' (przy użyciu hasła: TAK)” .

Wyjątek SQL

Jeśli mimo to połączenie z bazą zostanie nawiązane, będzie ciekawiej dalej. W przypadku błędów podczas pracy z bazą danych JDBC posiada specjalny wyjątek - java.sql.SQLException . Jak również kilka jego odmian.

Ten wyjątek ma tylko jedną dodatkową metodę (w porównaniu do klasy Exception) - metodę getSQLState(), która zwraca kod statusu (string), który zwrócił do niego serwer SQL. Obsługa błędów wygląda następująco:

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

Istnieją setki kodów błędów. Możesz zobaczyć pełną listę tutaj .

Ale czasami kody błędów pomagają JDBC lepiej zrozumieć błąd, a następnie zgłasza nie tylko wyjątek SQLException, ale także wyspecjalizowany wyjątek SQLException:

BatchUpdateException Błąd podczas żądania grupowego
Obcinanie danych Często występuje podczas obcinania długich danych
SQLClientInfoException Klient przekazał parametry, których nie można ustawić w połączeniu: Connection
SQLDataException Błąd danych, szczegóły zależą od typu DBMS
SQLException Błąd dostępu do bazy danych lub inne błędy ogólne
SQLFeatureNotSupportedException DBMS nie obsługuje tej funkcjonalności
SQLIntegrityConstraintViolationException Wszystkie błędy z for SQLState ==22
SQLInvalidAuthorizationSpecException Błąd dostępu i/lub autoryzacji
SQLNonTransientConnectionException Wszystkie błędy dla SQLState ==08
SQLRecoverableException Wystąpił błąd, ale można go naprawić za pomocą aplikacji
SQLSyntaxErrorException Błąd w składni zapytania
SQLTimeoutException Żądanie trwało zbyt długo
SQLTransactionRollbackException Błąd podczas wycofywania transakcji
Ostrzeżenie SQL Ostrzeżenie wydane przez DBMS

Przykłady błędów

Jeśli błąd wystąpił na etapie aplikacji serwerowej, to zazwyczaj można go jedynie zarejestrować, a następnie zająć się bardziej szczegółowo. Ale jeśli stało się to, gdy aplikacja działała na komputerze programisty, musisz dokładnie zbadać przyczynę tego.

Istnieją dwie największe klasy błędów podczas pracy z bazą danych:

  • Poproś o błąd tekstowy
  • Błąd podczas pracy z ResultSet

Błąd w tekście żądania może wystąpić bardzo często. Zapytanie może być bardzo długie, zawierać kilka tabel (połączonych przez JOIN) i podzapytań (SUBSELECT). Nie jest łatwo znaleźć błąd w takiej prośbie. Ponadto żądania są często sklejane z części, dodawane są tam dane.

Pierwszym błędem, o którym powinieneś wiedzieć, jest SQLSyntaxErrorException . Taki błąd zwykle oznacza, że ​​masz literówkę w treści żądania.

Weźmy nasz ulubiony przykład:

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

I „przypadkowo” usuń gwiazdkę w treści żądania:

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

Wtedy otrzymamy wyjątek:

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)

Serwer SQL informuje nas, że przed FROM wystąpił błąd składni.

Uważnie przyglądamy się prośbie i myślimy. Jeśli nic nie przychodzi do głowy, a zdarza się to bardzo często, trzeba poprosić kogoś, aby sprawdził, co jest nie tak.

Innym częstym błędem jest błędna praca z ResultSet - wynikiem żądania. Załóżmy, że zapomniałeś, że przed odczytaniem danych „bieżący wiersz” obiektu ResultSet znajduje się przed pierwszym wierszem, wtedy otrzymasz następujący kod:

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

Otrzymasz ten błąd:


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)

Uważnie patrzymy na błąd i myślimy. Następnie szukamy w Google, znajdujemy kilka przykładów i próbujemy zrozumieć rozwiązanie.

Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy