- 締切済み
do - while文
こんにちは、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でだめなことってあるんですか? 結構困ってます。 ご存知の方はよろしくお願いします。
- Java
- 回答数3
- ありがとう数1
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hameggs
- ベストアンサー率38% (8/21)
amajunさんのおっしゃる通りです。 識者の方々におこられるのを承知で簡単に言うと・・・・ 1:データベースのカーソルは最初は一番最初の行の真上にいる。 ↓ 2:next()をおこなうと、カーソルが一つ下に移動する ↓ 3:行が存在していればtureが返り、rsが値を取得できる って感じに考えてはどうでしょ(・w・? (あぅ、怒られそうだ・・・^^;)
- m_hagizo
- ベストアンサー率65% (31/47)
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()){ 処理; }
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) { 処理 } } となるでしょう。
関連するQ&A
- do~while文がよくわかりません
今参考書で勉強しているのですが、do~while文がよくわかりません 。コードは下記のようになります。どうして前の処理結果が足されていくのか理解できません。こんな馬鹿にどうかわかりやすくご教授していただけないでしょうか!? <?php $s = $i = 0; do{ ++$i; $s += $i; }while($i < 10); print "1 から $i までの和は $s"; ?>
- ベストアンサー
- PHP
- do while文の条件
do while文の条件にprintfを使う場合、これはありなんでしょうか? 内容:0が入力されていたら、whileのprintfを実行してからdoに戻る。0以外ならprintfを実行しないで処理を抜ける。 int i; do { printf("0以外の数字を入力してください。\n"); scanf("%d",&i); }while(i == 0 && printf("まじめに入力してください。\n"));
- 締切済み
- C・C++・C#
- do-while文について
参考書を読んでいて分からないところが有りました。 「配列aの値を先頭から見ていき、その値が-1になるま配列bにコピーしていく。そのとき-1という値もコピーする。という処理をするものです。-1という値もコピーするため、このループは最低1回は実行されることになります。 i=0; do{ b[i]=a[i]; }while(b[i++]!=-1); 」 この場合、a[0]が-1のときにはb[0]に-1がコピーされるかもしれませんが、そうでない場合は「そのとき-1という値もコピーする。」というのは出来ないと思うのですが、どなたかご教授宜しくお願いします。
- ベストアンサー
- C・C++・C#
- perlのdo-while文で抜け出せない
perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{ my $a=<STDIN>; chomp($a); $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら while(1)にしてlastで抜けるようにすると code2ではeで抜け出すことができるように なりましたが、 do~while(1)にしたcode3では、 「Can't "last" outside a loop block at …」C というエラーが発生します。 code2とcode3はwhileがdo~whileになって 条件を見る位置がループの始めか終わりの 違いだけなのに、なぜ、code2ではOKで、 code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) { my $a=<STDIN>; chomp($a); last if ($a eq 'e'); $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{ my $a=<STDIN>; chomp($a); last if ($a eq 'e'); $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)
- ベストアンサー
- Perl
- do - while 文
以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }
- ベストアンサー
- C・C++・C#
- Do whileとFor文の脱出処理について
はじめまして。 VBについて素朴な質問なのですが For…Nextから抜けるにはExit for を使いDo…Loopから抜けるにはExit Doを使用しますが以下の場合はFor文の中でExit doを使用するのは可能なのでしょうか? Do while(条件) for i=1 to 12 if 条件 then exit do end if 処理1 next i 処理2 loop 本来ならfor文の中ではExit forを使用しますがfor文はDo while文 の中に含まれていますのでExit doでも出れると思ったのですがそうではないのでしょうか?ご回答よろしくお願いします。
- 締切済み
- Visual Basic
- while doについて
九九の表で、forの2重のプログラムは作成できたのですが、whileとdo~whileを使って書き直すやり方がわからないのです。 どうか教えてください。お願いします。 #include <stdio.h> main() { int i,j; for(j = 1; j <= 9; j++){ for(i = 1; i <= 9; i++) printf("%3d", j*i); printf("\n"); } }
- 締切済み
- C・C++・C#
- do-while文の処理が実行されない
コンパイラは通ったのですが、自分の思うように処理されない箇所があって困っています。 1区間の数字列を回帰直線で近似し、回帰直線との誤差が最大の点で区間を分割(誤差が閾値以上なら)するプログラムを作っています。次に分割した区間それぞれに同様の作業をし、分割が一つでもあればまた最初から繰り返す、どこも分割されなければ終了・・・という流れです。 プログラムでは do{ bunkatu=0; for(全ての区間){ (最大誤差や回帰直線の傾きを0に初期化する) (傾き、最大誤差求める) if(最大誤差が閾値以上なら){ (最大誤差の点を境に区間を分けるよう設定) bunkatu = 1;} } }while((bunkatu) != 0); と表しています。分割が一つでもあれば変数 bunkatu が1になり、whileの条件 (bunkatu) != 0 と合っているのでまた do 以下から動作する・・・と考えているのですが、考え方としてはこれで合っているのでしょうか。
- 締切済み
- C・C++・C#
- getStringの値がNULLの時の処理
DB:SQL Server 2005 JDBCを使ってデータベースへアクセスし、SQL発行して結果をResultsetに格納、getStringで各項目の値を取得するところまでは確認できています。 外部結合したテーブルを参照していおり、getString()でnullを取得した場合にjava.lang.NullPointerExceptionが返ってエラーとなってしまいます。 回避策はあるのでしょうか? 抜粋したソースを下記に記します。 -- test.jsp -- <% ResultSet rs = db.executeQuery(sql); while(rs.next()){ String disp_object = rs.getString("object"); if(disp_object == null) disp_object="---"; } %> <tr>Object</tr> <tr><%=disp_object%></tr>
- ベストアンサー
- Java
- WebSphere/DB2/ResultSet close/Exception
WebSphereを使って、Listenerで取得したデータソースを利用していますが、 String sql1 = "SELECT A1 FROM TEST1"; String sql2 = "SELECT B2 FROM TEST2 WHERE B1 = ?"; Connection conn = datasource.getConnection(); PreparedStatement ps1 = conn.preparedStatement(sql1); ResultSet rs1 = ps1.executeQuery(); while(rs1.next()){ PreparedStatement ps2 = conn.preparedStatement(sql2); ps2.setString(1,rs1.getString("A1")); ResultSet rs2 = ps2.executeQuery(); ps2.close(); } このロジックで、ps2をクローズすると、ps1で取得したResultSet rs1がクローズされるというExceptionが発生してしまいます。 (ループして戻ったときにrs1.next()でexceptionが起こる) なにか対処方法があるかご存知の方いらっしゃいましたら、よろしくお願いいたします。
- ベストアンサー
- Java
お礼
みなさん、ありがとうございます。 問題解決しました! 問題は別のところにありました。。。 どこがいけなかったかというと、while(条件A)文の最後のデータαとdo文の最初のデータβは同じで、その同じ行同じ列のデータをそれぞれwhile(条件A)文とdo文でgetStringしてたんです! 同じ行の同じ列を2度getStringすると落ちるんですねー。 知らなかった。。。 そんなこんなでロジックを組みなおし、すっかり動くようになりました。 どうもお騒がせしました&ありがとうございました!