7
boolean r = false ; int s = 0 ;
while (r == false) ; 
{
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
}

3 または 123 が入力され、ループが終了しない場合でも、テキスト自体は表示されません。ここで何が問題なのですか?

4

7 に答える 7

33

条件の後にセミコロンがあります。中括弧を使用してブロックを指定するwhile場合、セミコロンは使用しません。

于 2010-04-09T20:28:33.070 に答える
9

「;」を削除します しばらくして。

于 2010-04-09T20:28:34.557 に答える
8

他の人がバグを指摘していますが、あなたのコードは別の意味で恐ろしく、最終的につまずきます:

if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
else r = true ; 

iforelse句の場合、複数のステートメントを簡単に実行できるため、これは悪いことです。中括弧を使用し、条件ステートメントを 1 行に配置しないようにします。

if (!(s>=0 && s<=2))
{
    System.out.println ("try again not a valid response");
}
else
{
    r = true;
}

読みやすく、見にくいバグが発生する可能性がはるかに低くなります。

于 2010-04-09T20:32:01.070 に答える
3

他のコメントに加えて、if も変更する必要があります。

if (s < 0 || s > 2)

この方がずっと分かりやすいです。

于 2010-04-10T01:24:19.760 に答える
3

while(r == false)

する必要があります

ながら(!r)

他の誰もがセミコロンについて言ったことにもかかわらず、それは私がそれで間違っていると思うものです:)

于 2010-04-09T20:37:52.333 に答える
3

ダニエル・ディパオロに+1。これが当てはまる理由を明確にするために、別の回答を投稿すると思いました。

Java の while ループは、2 つの方法のいずれかで記述できます。ループの本体に 1 行しかない場合は、簡略化して記述できます。

while (true)
    System.out.println("While loop");

これにより、プログラムが終了するまでコンソールに「While loop」と表示されます。もう 1 つのオプションは、上記で行ったように、中括弧の間にループ本体を指定することです。

int i = 0;
while (i < 10) {
    System.out.println("i = " + i);
    i++;
}

これにより、「i = 0」、「i = 1」、...、「i = 9」がそれぞれ別の行に出力されます。

あなたが投稿したコードは、2つを混同しています。省略形の while ループでは、Java パーサーは while ループ条件とセミコロンの間にステートメントがあることを期待しています。ここではステートメントが見つからないため、while ループは実行されますが、何もしません。それには体がありません。さらに、ループには本体がないため、変数 r が新しい値を想定する機会はありません。条件は常に true と評価され、ループは終了しません。

あなたの例で while ループの条件を否定する場合、つまり、

boolean r = false ; int s = 0 ;
while (r != false) ; 
{
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
}

(間違ったセミコロンをそこに残したことに注意してください)、ループが実行されないため、意図したループ本体が正確に1回実行されることがわかります。

于 2010-04-09T20:39:04.550 に答える
1

無関係な答えですが、Sunのスタイルガイドラインに従うことを本当にお勧めします。

boolean r = false ; 
int s = 0 ;
while (r == false) {
    s = getInt() ; 
    if (!(s>=0 && s<=2)) {
        System.out.println ("try again not a valid response") ; 
    } else {
      r = true ;
    } 
}

rループ自体で結果を評価すると、変数と if/else 条件を取り除くことができます。

int s = 0;

while( ( s = getInt() ) < 0 || s > 2 ) {
    System.out.println( "Try again, not a valid response");
}
于 2010-04-10T02:34:05.800 に答える