为什么这个循环会回到开头?

时间:2017-12-27 04:11:06

标签: java if-statement do-while

import java.util.ArrayList;
import java.util.Scanner;

class SteppingStone4_Loops {

    public static void main(String[] args) {
       Scanner scnr = new Scanner(System.in);
       String recipeName = "";
       ArrayList<String> ingredientList = new ArrayList();
       String newIngredient = "";
       boolean addMoreIngredients = true;

       System.out.println("Please enter the recipe name: ");
       recipeName = scnr.nextLine();


       do {           
           System.out.println("Would you like to enter an ingredient: (y or n)");
           String reply = scnr.next().toLowerCase();

           /**The code should check the reply:
            *   "y" --> prompt for the ingredient and add it to the ingredient list;
            *   "n" --> break out of the loop;  
            *   anything else --> prompt for a "y" or "n"
            */

          while (true) {
             if (reply.equals("y")) {
               System.out.println("Enter ingredient name: "); 
               newIngredient = scnr.next();   
               ingredientList.add(newIngredient);
             break;
           }
             else if (reply.equals("n")) {
                System.out.println("Goodbye!");
                break;
             }

            else  
               break;
           }


            } while (addMoreIngredients);
           for (int i = 0; i < ingredientList.size(); i++) {
           String ingredient = ingredientList.get(i);
           System.out.println(ingredient);
       }
    }
}

运行时,程序返回:

请输入食谱名称:
玉米粥
你想输入一种成分:(y或n)
ÿ
输入成分名称:

你想输入一种成分:(y或n)
ñ
你想输入一种成分:(y或n)
5
你想输入一种成分:(y或n)

为什么在回复= n时它没有中断?为什么它会回到&#34;你想要输入一种成分&#34;?有人可以查明我的错误或者建议采用不同的方式吗?感谢

4 个答案:

答案 0 :(得分:1)

请注意,您有2个while循环

  else if (reply.equals("n")) {
            System.out.println("Goodbye!");
            break;
         }

上述条件将从内部while循环中断开,而while循环仍将继续,这就是为什么你得到输出“你想输入一个成分”,这是外循环的一部分。

因为,在外部循环中,您具有以下条件,即true并且似​​乎永远不会更改。

while (addMoreIngredients)

因此,在离开内循环之前,您可以将addMoreIngredients更改为false

  else if (reply.equals("n")) {
        System.out.println("Goodbye!");
        addMoreIngredients = false;
        break;
     }

只是为了让您知道,您也可以使用标签中断。

答案 1 :(得分:0)

while (addMoreIngredients);

此行始终返回true。所以你的do循环继续循环。

我建议在内圈中为外圈设置一个标志。

- 编辑----- 让我们摆脱内循环,我认为它应该工作正常。 PS:现在我无法访问JRE。但我认为它应该有效

do {           
           System.out.println("Would you like to enter an ingredient: (y or n)");
           String reply = scnr.next().toLowerCase();

             if (reply.equals("y")) {
               System.out.println("Enter ingredient name: "); 
               newIngredient = scnr.next();   
               ingredientList.add(newIngredient);
               continue;
           }
             else if (reply.equals("n")) {
                System.out.println("Goodbye!");
                break;
             }

            else {
            System.out.println("Invalid option!");
            continue;
            }   
 } while (addMoreIngredients);

答案 2 :(得分:0)

请检查你是否在内循环中有嵌套循环和break语句只是从内循环中断出来并且你应用了do-while循环的第二个条件 addMoreIngredients = true

  

破坏陈述只会打破内循环。

     

因此始终会运行,因为addMoreIngredients始终为真。

答案 3 :(得分:0)

make addMoreIngredients为false

 else if (reply.equals("n")) {
            System.out.println("Goodbye!");
            addMoreIngredients = false;
            break;
         }