3

Sybase ASE でクエリを実行して、そのクエリを生成し、ResultSetその内容をトラバースしてファイルに書き込みます。時々、これは をスローしNullPointerException、 が であることを示しResultSetますnull。ただし、1 つまたは 2 つのレコードを印刷した後にこれを行います。それ以外の場合は、まったく同じ入力でエラーが発生しません。

このエラーを一貫して生成することができませんでした。エラー メッセージは次の行を指しています。

output.print(rs.getString(1));

何らかの理由で、クエリの実行に少し時間がかかる場合に発生するようです。これまでに返されたレコードセットは非常に少なかった (4 ~ 7 レコード)。場合によっては、アプリを 3 回または 4 回実行する必要があります。その後、クエリが「ウォームアップ」されたかのように、エラーが停止します。クエリを手動で実行しましたが、パフォーマンスの問題はないようです。

再度、感謝します!

4

6 に答える 6

3

rs.getString(1)ではなく、nullであるのはResultSetであると確信していますか?

これは典型的なJavaクエリです

preparedStatement.setLong(1, primaryKey);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
{
  String foo = rs.getString(1);
  if (foo != null)
    ...
}
于 2008-12-18T03:15:37.077 に答える
2

rs.next()を呼び出した後、うまくやってくれることを願っています。

スペックによると。いずれの場合も、ResultSetオブジェクトがnullになることはありません。レコードが見つからない場合でも。コードスニペットとスタックトレースを投稿すると、より良い答えを得るのに間違いなく役立ちます。

編集: 以来、エラーはその行を指しています。null文字列でtoString()メソッドを呼び出している可能性があり、これによりNullPointerExceptionが発生しました。ただし、渡された引数が文字列型の場合、標準出力(System.out.println())では発生しません。しかし、あなたはoutput.print()を使用しているので、これについてはよくわかりません。舞台裏で、渡されたString引数でtoString()を呼び出している可能性があります。

于 2008-12-18T03:11:14.620 に答える
1

の型はoutput何ですか? output.printメソッドは処理しますかnull?

rs.getObject(1)呼び出す前に nullかどうかを確認してくださいoutput.print(rs.getString(1))

于 2008-12-18T08:31:13.820 に答える
0

この問題の解決策を見つけました - データベース接続があまりにも早く閉じられていました。データベース接続が閉じられるとすぐに、レコードポインターがnullになることに気づきませんでした-結果セットがシステムメモリにあると思いました。

解決策は、while(rs.next()) ループが終了した後で接続を閉じることです。

再度、感謝します。

于 2009-01-21T13:44:35.163 に答える
0

接続はまだアクティブですか? 接続プールを使用していますか?

その JDBC ドライバーのデバッグ ログを有効にできるかどうかを確認します。

ドライバーを新しいバージョンにアップグレードできるかどうかを確認してください。

于 2008-12-18T13:50:47.420 に答える
-2

次のようなデータにアクセスするためのものをラップしてみてください:

if(rs!=null && rs.next()) {

// ものを読む

}

それでも解決しない場合は、null 自体の読み取り値を確認することをお勧めします。

于 2008-12-18T04:04:48.193 に答える