Omgaan met bugs

Beschikbaar

Tranen en pijn

Er kunnen fouten optreden tijdens het uitvoeren van een Java-programma. Bij het werken met de database zullen fouten optreden. Het gaat erom welke van hen u kunt voorspellen en een adequate oplossing kunt bieden.

De eerste grote groep fouten wacht op u bij het uitvoeren van deze regel:

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

Wat kun je hier verwachten?

Fout 1. Stuurprogramma niet gevonden .

Als u de foutmelding "Geen geschikt stuurprogramma gevonden voor ..." krijgt , betekent dit dat de DriverManager niet kan begrijpen welk type DBMS achter uw URL zit. U schreef bijvoorbeeld jdbc_mysql: in plaats van jdbc:mysql:

Fout 2. Verbindingsfout .

Als u een fout maakt in de hostnaam, krijgt u hoogstwaarschijnlijk een bericht als "Zo'n host is niet bekend" of "Communicatielink mislukt".

Fout 3. De databasenaam is onjuist .

Als je de naam van de database verkeerd hebt gespeld of verbinding hebt gemaakt met een andere server waar deze niet bestaat, krijg je een bericht als “Onbekende database 'supershop3'” .

Fout 4. Verkeerde login of wachtwoord .

Als u het databasewachtwoord bent vergeten of het onjuist hebt ingevoerd, ontvangt u hoogstwaarschijnlijk een bericht als "Toegang geweigerd voor gebruiker 'root'@'localhost' (met wachtwoord: JA)" .

SQL-uitzondering

Als de verbinding met de basis toch tot stand komt, wordt het verder interessanter. In het geval van fouten bij het werken met de database, heeft JDBC een speciale uitzondering - java.sql.SQLException . Evenals een aantal van zijn variëteiten.

Deze exception heeft slechts één extra methode (vergeleken met de klasse Exception) - de getSQLState()-methode, die de statuscode (tekenreeks) retourneert die de SQL-server ernaar heeft teruggestuurd. Foutafhandeling ziet er als volgt uit:

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

Er zijn honderden foutcodes. U kunt de volledige lijst hier bekijken .

Maar soms helpen foutcodes JDBC de fout beter te begrijpen en dan gooit het niet alleen SQLException, maar gespecialiseerde SQLException:

BatchUpdateException Fout tijdens groepsverzoek
GegevensTruncation Komt vaak voor bij het afkappen van lange gegevens
SQLClientInfoException De client heeft parameters doorgegeven die niet kunnen worden ingesteld op de verbinding: Verbinding
SQLDataException Fout met gegevens, details zijn afhankelijk van het type DBMS
SQLUitzondering Databasetoegangsfout of andere algemene fouten
SQLFeatureNotSupportedException DBMS ondersteunt deze functionaliteit niet
SQLIntegrityConstraintViolationException Alle fouten met voor SQLState ==22
SQLInvalidAuthorizationSpecException Toegangs- en/of autorisatiefout
SQLNonTransientConnectionException Alle fouten met voor SQLState ==08
SQLRecoverableException Er is een fout opgetreden, maar deze kan worden verholpen met tussenkomst van de applicatie
SQLSyntaxErrorException Fout in query-syntaxis
SQLTimeoutException Aanvraag duurde te lang
SQLTransactionRollbackException Fout tijdens het terugdraaien van de transactie
SQLWaarschuwing Waarschuwing afgegeven door het DBMS

Voorbeelden van fouten

Als er een fout is opgetreden in het stadium van de servertoepassing, kan deze meestal alleen worden gelogd en vervolgens in meer detail worden afgehandeld. Maar als het gebeurde terwijl de applicatie op de computer van de programmeur draaide, dan moet je de reden hiervoor zorgvuldig onderzoeken.

Er zijn twee grootste soorten fouten bij het werken met een database:

  • Verzoek om tekstfout
  • Fout tijdens het werken met ResultSet

Een fout in de aanvraagtekst kan heel vaak voorkomen. De query kan erg lang zijn, meerdere tabellen bevatten (samengevoegd via JOIN) en subquery's (SUBSELECT). Het is niet eenvoudig om een ​​fout in zo'n verzoek te vinden. Daarnaast worden aanvragen vaak uit onderdelen aan elkaar gelijmd, daar worden gegevens aan toegevoegd.

De allereerste fout waarvan u op de hoogte moet zijn, is SQLSyntaxErrorException . Een dergelijke fout betekent meestal dat u een typfout in de aanvraagtekst hebt.

Laten we ons favoriete voorbeeld nemen:

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

En verwijder "per ongeluk" het sterretje in de aanvraagtekst:

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

Dan krijgen we een uitzondering:

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 vertelt ons dat er een syntaxisfout was vóór FROM.

We bekijken de aanvraag zorgvuldig en denken na. Als er niets in je opkomt, en dit gebeurt heel vaak, dan moet je iemand vragen om te kijken wat er aan de hand is.

Een andere veel voorkomende fout is onjuist werken met ResultSet - het resultaat van het verzoek. Stel dat u bent vergeten dat vóór het lezen van de gegevens de "huidige rij" van het object ResultSet voor de eerste rij komt, dan heeft u de volgende code:

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

U krijgt deze foutmelding:


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)

We kijken zorgvuldig naar de fout en denken na. Dan googlen we en vinden we een paar voorbeelden en proberen we de oplossing te begrijpen.

Opmerkingen
  • Populair
  • Nieuw
  • Oud
Je moet ingelogd zijn om opmerkingen te kunnen maken
Deze pagina heeft nog geen opmerkingen