2016-10-09 10 views
0

これは、さまざまな形の関数を実行するループですが、その形の関数を実行した後、ユーザーが「終了」を入力するまで形を要求し続けます。私はこれまで三角形だけを行っていますので、正しくループすることを確認するためにいくつかのフィラー関数を用意しています。問題は、私が三角形で作業​​した後、一度印刷するのではなく、入力を求める前にメニューを2回印刷することです。誰も私にこれを説明することはできますか?なぜこのwhileループは2回繰り返されますか?

while(password){ 
    System.out.println(); 
    System.out.println("---Welcome to the Shape Machine---"); 
    System.out.println("Available Options:"); 
    System.out.println("Circles"); 
    System.out.println("Rectangles"); 
    System.out.println("Triangles"); 
    System.out.println("Exit"); 
    String option = keyboard.nextLine(); 

    if(option.equals("Exit")){ 
     System.out.println("Terminating the program. Have a nice day!"); 
     return; 
    } else if(option.equals("Triangles")){ 
     System.out.println("Triangles selected. Please enter the 3 sides:"); 
     int sideA = 0; 
     int sideB = 0; 
     int sideC = 0; 
     do{ 
      sideA = keyboard.nextInt(); 
      sideB = keyboard.nextInt(); 
      sideC = keyboard.nextInt(); 

      if(sideA<0 || sideB<0 || sideC<0) 
       System.out.println("#ERROR Negative input. Please input the 3 sides again."); 
     } while(sideA<0 || sideB<0 || sideC<0); 

     if((sideA+sideB)<=sideC || (sideB+sideC)<=sideA || (sideA+sideC)<=sideB){ 
      System.out.println("#ERROR Triangle is not valid. Returning to menu."); 
      continue; 
     } else { 
      System.out.println("good job!"); 
     } 
    } 
} 
+0

不完全なコード? –

+0

'password'とは何ですか?なぜあなたのループの内部で決してリセットされないのですか? – Makoto

答えて

0

keyboard.nextLine();を使用している可能性があります。 whileループの外側のコードでは、常に.nextLine()を使用していることを確認してください。

推理:.next()を使用すると、1単語しか消費されないので、次回に.nextLine()と電話すると、その行の最後を消費します。

0

sideC = keyboard.nextInt()と言った後で、入力したキャリッジリターン(数値を入力した後も)は入力バッファに残ります。次に、メニューを印刷して実行します。String option = keyboard.nextLine();このコマンドは、見つかった最初の改行(バッファに残っている改行)を読み込みます。 したがって、optionは、 "Exit"または "Triangle"と一致しない裸の改行文字になっているので、再びループしてメニューを再度表示します。

0

この問題は、スペース、キャリッジリターン、改行、フォームフィードなどの左上の文字が入力バッファにあるために発生します。

次のkeyboard.nextLine()は、指定されたオプションと一致しないため(このケースを処理するwhileループの最後に「else」がないため)、コントロールは次の繰り返しに進みますオプションをもう一度表示します。入力処理の周囲のコンテキストに基づいて、SOに関するこの問題に対処するいくつかの良い答えがあります。

有効な文字列(オプション)が得られるまで、すべての空白、改行、改行、改ページをスキップすることになるので、次のコードはあなたのような場合に最適です。

System.out.println(); 
System.out.println("---Welcome to the Shape Machine---"); 
//... 
System.out.println("Exit"); 
String option = keyboard.nextLine(); 
keyboard.skip("[\\s]*"); 
関連する問題