Ł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.
GO TO FULL VERSION