Umgang mit Fehlern

Verfügbar

Tränen und Schmerz

Beim Ausführen eines Java-Programms können Fehler auftreten. Beim Arbeiten mit der Datenbank können Fehler auftreten. Es kommt darauf an, welche davon Sie vorhersagen und eine adäquate Lösung anbieten können.

Die erste große Gruppe von Fehlern erwartet Sie, wenn Sie diese Zeile ausführen:

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

Was erwartet Sie hier?

Fehler 1. Treiber nicht gefunden .

Wenn Sie die Fehlermeldung „Kein passender Treiber gefunden für …“ erhalten , bedeutet dies, dass der DriverManager nicht erkennen konnte, welcher DBMS-Typ sich hinter Ihrer URL verbirgt. Sie haben beispielsweise jdbc_mysql: anstelle von jdbc:mysql: geschrieben.

Fehler 2. Verbindungsfehler .

Wenn Sie beim Hostnamen einen Fehler machen, erhalten Sie höchstwahrscheinlich eine Meldung wie „Es ist kein solcher Host bekannt“ oder „Fehler bei der Kommunikationsverbindung“.

Fehler 3. Der Datenbankname ist falsch .

Wenn Sie den Datenbanknamen falsch geschrieben haben oder eine Verbindung zu einem anderen Server herstellen, auf dem er nicht existiert, erhalten Sie eine Meldung wie „Unbekannte Datenbank ‚supershop3‘“ .

Fehler 4. Falscher Login oder Passwort .

Wenn Sie das Datenbankkennwort vergessen oder falsch eingegeben haben, erhalten Sie höchstwahrscheinlich eine Meldung wie „Zugriff verweigert für Benutzer 'root'@'localhost' (mit Kennwort: JA)“ .

SQL-Ausnahme

Sollte die Verbindung zur Basis dennoch zustande kommen, dann wird es weiter interessanter. Bei Fehlern beim Arbeiten mit der Datenbank gibt es bei JDBC eine spezielle Ausnahme – java.sql.SQLException . Sowie mehrere seiner Sorten.

Diese Ausnahme verfügt nur über eine zusätzliche Methode (im Vergleich zur Exception-Klasse) – die Methode getSQLState(), die den Statuscode (String) zurückgibt, den der SQL-Server an sie zurückgegeben hat. Die Fehlerbehandlung sieht folgendermaßen aus:

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

Es gibt Hunderte von Fehlercodes. Die vollständige Liste finden Sie hier .

Aber manchmal helfen Fehlercodes JDBC, den Fehler besser zu verstehen, und dann wird nicht nur eine SQLException, sondern eine spezielle SQLException ausgelöst:

BatchUpdateException Fehler bei der Gruppenanfrage
Datenkürzung Tritt häufig auf, wenn lange Daten abgeschnitten werden
SQLClientInfoException Der Client hat Parameter übergeben, die für die Verbindung nicht festgelegt werden können: Verbindung
SQLDataException Fehler bei den Daten, Details hängen vom Typ des DBMS ab
SQLException Datenbankzugriffsfehler oder andere allgemeine Fehler
SQLFeatureNotSupportedException DBMS unterstützt diese Funktionalität nicht
SQLIntegrityConstraintViolationException Alle Fehler mit für SQLState ==22
SQLInvalidAuthorizationSpecException Zugriffs- und/oder Autorisierungsfehler
SQLNonTransientConnectionException Alle Fehler mit für SQLState ==08
SQLRecoverableException Es liegt ein Fehler vor, der jedoch durch Eingreifen der Anwendung behoben werden kann
SQLSyntaxErrorException Fehler in der Abfragesyntax
SQLTimeoutException Die Anfrage hat zu lange gedauert
SQLTransactionRollbackException Fehler beim Transaktions-Rollback
SQLWarning Vom DBMS ausgegebene Warnung

Fehlerbeispiele

Wenn bereits auf der Serveranwendung ein Fehler aufgetreten ist, kann dieser in der Regel nur protokolliert und anschließend detaillierter behandelt werden. Wenn es jedoch passiert ist, während die Anwendung auf dem Computer des Programmierers ausgeführt wurde, müssen Sie den Grund dafür sorgfältig untersuchen.

Bei der Arbeit mit einer Datenbank gibt es zwei größte Fehlerklassen:

  • Fehler im Anforderungstext
  • Fehler beim Arbeiten mit ResultSet

Ein Fehler im Anfragetext kann sehr häufig auftreten. Die Abfrage kann sehr lang sein, mehrere Tabellen (verknüpft über JOIN) und Unterabfragen (SUBSELECT) enthalten. Es ist nicht einfach, in einer solchen Anfrage einen Fehler zu finden. Darüber hinaus werden Anfragen häufig aus Teilen zusammengeklebt, Daten werden dort hinzugefügt.

Der allererste Fehler, den Sie beachten sollten, ist SQLSyntaxErrorException . Ein solcher Fehler bedeutet normalerweise, dass Sie einen Tippfehler im Anfragetext haben.

Nehmen wir unser Lieblingsbeispiel:

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

Und „versehentlich“ das Sternchen im Anfragetext löschen:

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

Dann bekommen wir eine Ausnahme:

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)

Der SQL Server teilt uns mit, dass vor FROM ein Syntaxfehler aufgetreten ist.

Wir schauen uns die Anfrage genau an und überlegen. Wenn Ihnen nichts einfällt, und das kommt sehr oft vor, müssen Sie jemanden bitten, nachzusehen, was falsch ist.

Ein weiterer beliebter Fehler ist die falsche Arbeit mit ResultSet – dem Ergebnis der Anfrage. Angenommen, Sie haben vergessen, dass vor dem Lesen der Daten die „aktuelle Zeile“ des ResultSet-Objekts vor der ersten Zeile steht, dann erhalten Sie den folgenden Code:

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

Sie erhalten diesen Fehler:


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)

Wir schauen uns den Fehler genau an und denken nach. Dann googeln wir, finden ein paar Beispiele und versuchen, die Lösung zu verstehen.

Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare