
こんにちは、tomokooです。
下記の様にソースを書きました。
rsはResultSetです。
----------------------------
while(条件A){
処理;
rs.next();
}
while(rs.next()){
処理;
}
----------------------------
うまくプログラムは動いたのですが
結果を見て1行飛ばされることに気づきました。
だから
----------------------------
while(条件A){
処理;
rs.next();
}
do{
処理;
}while(rs.next()};
----------------------------
としたところ、処理の中の
rs.getString(i); //iは初期化済み
で落ちてしまいます。
whileでよくてdo-whileでだめなことってあるんですか?
結構困ってます。
ご存知の方はよろしくお願いします。
No.2ベストアンサー
- 回答日時:
do{
処理;
} while(rs.next());
とした場合、rs.next()の評価を行う前に「処理」が実行されることに注意してください。つまり、最終レコードになったときに、最終レコードであることの判定が後に来てしまうために、rs.getString(i)で落ちている、ということです。
このロジックでこれを回避するためには、Statementを作るときに、「スクロール可能な」状態にしておく必要があるでしょう。修正すると、こんな感じです。
// スクロール可能なカーソルを作る
Statement stmt = connection.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
:
:
while(条件A){
処理;
rs.next();
}
rs.beforeFirst(); // カーソルを先頭行の手前に移動する
while(rs.next()){
処理;
}
No.3
- 回答日時:
amajunさんのおっしゃる通りです。
識者の方々におこられるのを承知で簡単に言うと・・・・
1:データベースのカーソルは最初は一番最初の行の真上にいる。
↓
2:next()をおこなうと、カーソルが一つ下に移動する
↓
3:行が存在していればtureが返り、rsが値を取得できる
って感じに考えてはどうでしょ(・w・?
(あぅ、怒られそうだ・・・^^;)
みなさん、ありがとうございます。
問題解決しました!
問題は別のところにありました。。。
どこがいけなかったかというと、while(条件A)文の最後のデータαとdo文の最初のデータβは同じで、その同じ行同じ列のデータをそれぞれwhile(条件A)文とdo文でgetStringしてたんです!
同じ行の同じ列を2度getStringすると落ちるんですねー。
知らなかった。。。
そんなこんなでロジックを組みなおし、すっかり動くようになりました。
どうもお騒がせしました&ありがとうございました!
No.1
- 回答日時:
do-whileでは、ループ中の処理を実行した後に条件判断されます。
つまり、どんな条件であろうが処理は必ず1回は実行されます。だからループの最初の1回では「条件に合わないが処理してしまう」ことがありえます。また、ResultSetの初期状態では、どのレコードも指していません。この状態でrs.getString()すると例外になります。rs.next()を実行して(trueが返れば)初めて1番目のレコードを指すようになり、getString()できるようになります。
以上から、do-whileの中のrs.getString()で例外が起こり得ます。
というわけで、すなおに
while(rs.next()) {
処理
}
と書くのがよいです。条件Aが絡むのであれば
// 条件Aが満たされなければ、以降のレコードは無視する
while(条件A && rs.next()) {
処理
}
または
// 条件Aを満たすレコードだけを拾う
while(rs.next()) {
if(条件A) {
処理
}
}
となるでしょう。
参考URL:http://www.javadrive.jp/servlet/jdbc/sql/index1. …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScriptからJAVAクラスを呼...
-
tryの終了
-
表示待ち時間に「処理中...」の...
-
vba Sleep関数について教えてく...
-
「タイプ初期化子が例外をスロ...
-
eclipse-Tomcatでのデバッグに...
-
関数内の変数に<summary>コメン...
-
エクセルVBAで、条件に一致する...
-
中学のクラス数
-
javascriptからjavaを呼び出したい
-
【sendkeysメソッドが動かずに...
-
Excelで =EMBED("Acrobat Docu...
-
引数で日付を2つ与え、その間の...
-
サーブレットコンテキストの意...
-
UMLのクラス図はmain()も含むん...
-
リフレクション
-
0歳児の指しゃぶりに関して
-
final修飾子を使っているのに、...
-
変数名の付け方
-
ウィンドウを最前面にできません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaプログラムからポップアッ...
-
Javaでのデバッグコード削除
-
tryの終了
-
Tomcat高負荷時の設定について
-
SwingUtilities.invokeLater(ne...
-
ラベルの表示までが異常に遅い...
-
vba Sleep関数について教えてく...
-
Delphiのマルチスレッドの割り...
-
ラジオボタンの選択判定
-
アコーディオンメニューをアン...
-
JSP、サーブレットの初期処理
-
ftp 同時複数接続の負荷テスト...
-
[Java] while(true)の意味
-
C#で別スレッドの終了を知りたい
-
switch文の中に、throws new Ex...
-
アロー関数がよくわかりません
-
セル範囲で文字を検索はFor必須?
-
PHP
-
Servlet+JSPを使ったWEBアプリ...
-
Javaプログラムから外部コマン...
おすすめ情報