バグへの対処

使用可能

涙と痛み

Java プログラムの実行中にエラーが発生する場合があります。データベースを操作すると、エラーが発生します。重要なのは、どれを予測して適切な解決策を提供できるかです。

この行を実行すると、最初の大きなエラー グループが待機します。

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

ここで何が期待できますか?

エラー 1。ドライバーが見つかりません

「…に適したドライバーが見つかりません」というエラーが表示された場合は、DriverManager が URL の背後にある DBMS の種類を理解できなかったことを意味します。たとえば、jdbc:mysql の代わりに jdbc_mysql: を記述したとします。

エラー 2。接続エラー

ホスト名を間違えると、「そのようなホストは認識されません」または「通信リンク障害」のようなメッセージが表示される可能性があります。

エラー 3。データベース名が正しくありません

データベース名のスペルを間違えた場合、またはデータベースが存在しない別のサーバーに接続した場合は、「不明なデータベース 'supershop3'」のようなメッセージが表示されます。

エラー 4.ログインまたはパスワードが間違っています

データベースのパスワードを忘れた場合、または間違って入力した場合は、「ユーザー 'root'@'localhost' のアクセスが拒否されました (パスワードを使用: YES)」のようなメッセージが表示される可能性があります。

SQL例外

それでもベースへの接続が確立されている場合は、さらに興味深いものになります。データベースの操作中にエラーが発生した場合、JDBC には特別な例外java.sql.SQLExceptionがあります。同様に、その品種のいくつか。

この例外には、(Exception クラスと比較して) 追加メソッドが 1 つだけあります。getSQLState() メソッドは、SQL サーバーから返されたステータス コード (文字列) を返します。エラー処理は次のようになります。

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

何百ものエラーコードがあります。完全なリストはここでご覧いただけます。

ただし、エラー コードによって JDBC がエラーをよりよく理解できるようになり、SQLException だけでなく特殊な SQLException がスローされる場合があります。

バッチ更新例外 グループリクエスト中のエラー
データの切り捨て 長いデータを切り捨てるときによく発生します
SQLClientInfoException クライアントが接続に設定できないパラメータを渡しました: 接続
SQLDataException データのエラー。詳細は DBMS の種類によって異なります
SQL例外 データベースアクセスエラーまたはその他の一般的なエラー
SQLFeatureNotSupportedException DBMS はこの機能をサポートしていません
SQLIntegrityConstraintViolationException SQLState ==22 のすべてのエラー
SQLInvalidAuthorizationSpecException アクセスおよび/または認証エラー
SQLNonTransientConnectionException SQLState ==08 のすべてのエラー
SQLRecoverableException エラーがありますが、アプリケーションの介入で修正できます
SQLSyntaxErrorException クエリ構文のエラー
SQLTimeoutException リクエストに時間がかかりすぎました
SQLTransactionRollbackException トランザクションのロールバック中にエラーが発生しました
SQL警告 DBMSが発行する警告

エラー例

サーバー アプリケーションの段階でエラーが発生した場合、通常はログに記録するだけで、より詳細に対処できます。ただし、プログラマのコンピュータでアプリケーションを実行中に問題が発生した場合は、その理由を注意深く調査する必要があります。

データベースを操作する場合、エラーには 2 つの大きなクラスがあります。

  • リクエストテキストエラー
  • ResultSet の操作中にエラーが発生しました

リクエスト テキストのエラーは非常に頻繁に発生する可能性があります。クエリは非常に長くなり、複数のテーブル (JOIN で結合) とサブクエリ (SUBSELECT) が含まれる場合があります。このようなリクエストのエラーを見つけるのは簡単ではありません。さらに、リクエストはパーツから結合されることが多く、そこにデータが追加されます。

注意すべき最初のエラーはSQLSyntaxErrorExceptionです。このようなエラーは通常、リクエスト本文にタイプミスがあることを意味します。

私たちのお気に入りの例を見てみましょう。

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

そして、リクエスト本文のアスタリスクを「誤って」削除してしまいます。

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

次に、例外が発生します。

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 サーバーは、FROM の前に構文エラーがあったことを通知します。

ご要望をしっかりと拝見し、考えさせていただきます。何も思い浮かばず、これが頻繁に起こる場合は、誰かに何が問題なのかを尋ねる必要があります。

もう 1 つのよくある間違いは、リクエストの結果である ResultSet の誤った処理です。データを読み取る前に、ResultSet オブジェクトの「現在の行」が最初の行の前にあることを忘れていたとすると、次のコードが得られます。

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

次のエラーが表示されます。


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)

エラーを注意深く見て考えます。次に、Google でいくつかの例を見つけ、解決策を理解しようとします。

コメント
  • 人気
  • 新規
  • 古い
コメントを残すには、サインインしている必要があります
このページにはまだコメントがありません