Lacrime e dolore

Possono verificarsi errori durante l'esecuzione di un programma Java. Quando si lavora con il database, si verificheranno errori. È tutto su quale di loro puoi prevedere e offrire una soluzione adeguata.

Il primo grande gruppo di errori ti aspetterà durante l'esecuzione di questa riga:

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

Cosa puoi aspettarti qui?

Errore 1. Driver non trovato .

Se ricevi l'errore "Nessun driver adatto trovato per …" , significa che DriverManager non è riuscito a capire quale tipo di DBMS si trova dietro il tuo URL. Ad esempio, hai scritto jdbc_mysql: invece di jdbc:mysql:

Errore 2. Errore di connessione .

Se commetti un errore nel nome host, molto probabilmente riceverai un messaggio del tipo "Nessun host di questo tipo è noto" o "Errore del collegamento di comunicazione".

Errore 3. Il nome del database non è corretto .

Se hai scritto male il nome del database o ti sei connesso a un altro server dove non esiste, riceverai un messaggio come "Database sconosciuto 'supershop3'" .

Errore 4. Login o password errati .

Se hai dimenticato la password del database o l'hai inserita in modo errato, molto probabilmente riceverai un messaggio del tipo "Accesso negato per l'utente 'root'@'localhost' (utilizzando la password: YES)" .

Eccezione SQL

Se la connessione alla base viene comunque stabilita, sarà ulteriormente interessante. In caso di errori quando si lavora con il database, JDBC ha un'eccezione speciale: java.sql.SQLException . Così come molte delle sue varietà.

Questa eccezione ha un solo metodo aggiuntivo (rispetto alla classe Exception): il metodo getSQLState(), che restituisce il codice di stato (stringa) restituito dal server SQL. La gestione degli errori è simile a questa:

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

Ci sono centinaia di codici di errore. Puoi vedere l'elenco completo qui .

Ma a volte i codici di errore aiutano JDBC a comprendere meglio l'errore e quindi genera non solo SQLException, ma SQLException specializzato:

BatchUpdateException Errore durante la richiesta di gruppo
Troncamento dei dati Si verifica spesso durante il troncamento di dati lunghi
SQLClientInfoException Il client ha passato parametri che non possono essere impostati sulla connessione: Connessione
SQLDataException Errore con i dati, i dettagli dipendono dal tipo di DBMS
SQLException Errore di accesso al database o altri errori generali
SQLFeatureNotSupportedException DBMS non supporta questa funzionalità
SQLIntegrityConstraintViolationException Tutti gli errori con per SQLState ==22
SQLInvalidAuthorizationSpecException Errore di accesso e/o autorizzazione
SQLNonTransientConnectionException Tutti gli errori con per SQLState ==08
SQLRecoverableException C'è un errore, ma può essere corretto con l'intervento dell'applicazione
SQLSyntaxErrorException Errore nella sintassi della query
SQLTimeoutException La richiesta ha richiesto troppo tempo
SQLTransactionRollbackException Errore durante il rollback della transazione
SQLWarning Avviso emesso dal DBMS

Esempi di errore

Se si è verificato un errore nella fase dell'applicazione server, di solito può solo essere registrato e quindi trattato in modo più dettagliato. Ma se è successo mentre l'applicazione era in esecuzione sul computer del programmatore, è necessario indagare attentamente sul motivo.

Ci sono due maggiori classi di errori quando si lavora con un database:

  • Errore nel testo della richiesta
  • Errore durante l'utilizzo di ResultSet

Un errore nel testo della richiesta può verificarsi molto spesso. La query può essere molto lunga, contenere diverse tabelle (unite tramite JOIN) e sottoquery (SUBSELECT). Non è facile trovare un errore in una simile richiesta. Inoltre, le richieste sono spesso incollate insieme da parti, i dati vengono aggiunti lì.

Il primo errore di cui dovresti essere a conoscenza è SQLSyntaxErrorException . Un tale errore di solito significa che hai un errore di battitura nel corpo della richiesta.

Prendiamo il nostro esempio preferito:

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

E "accidentalmente" cancella l'asterisco nel corpo della richiesta:

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

Quindi avremo un'eccezione:

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)

Il server SQL ci dice che c'era un errore di sintassi prima di FROM.

Esaminiamo attentamente la richiesta e pensiamo. Se non ti viene in mente nulla, e questo accade molto spesso, allora devi chiedere a qualcuno di vedere cosa c'è che non va.

Un altro errore comune è il lavoro errato con ResultSet , il risultato della richiesta. Supponiamo di aver dimenticato che prima di leggere i dati, la "riga corrente" dell'oggetto ResultSet viene prima della prima riga, allora avrai il seguente codice:

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

Otterrai questo errore:


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)

Osserviamo attentamente l'errore e pensiamo. Quindi cerchiamo su Google e troviamo un paio di esempi e proviamo a capire la soluzione.