【问题标题】:do while loop Java做while循环Java
【发布时间】:2017-06-20 19:46:07
【问题描述】:

所以我几乎是编码的新手,并且正忙于玩“do while 循环”,我的代码可能很糟糕,而且很可能有 1000 种更好的方法来做我想做的事情,但无论如何。

我正在尝试使用 main 方法,然后使用其他两种方法(出于练习目的)要求用户选择 1 到 10 之间的数字,然后如果他们想再试一次。

我让代码运行,直到它要求用户输入是/否,但随后代码停止运行,我不知道为什么?

public static void main(String[] args) {
    chooseNum();

}

public static boolean chooseNum() {
    int number = 4;
    do {
        System.out.println("Enter a number 1 to 10");
        int userNum = in.nextInt();
        if (number == userNum) {
            System.out.println("You chose the correct number!");
            return tryAgain();
        } else if (number != userNum) {
            System.out.println("You chose the incorrect number!");
            return tryAgain();
        } else
            System.out.println("invalid Response");
    }
    while (false);
    return false;
}

public static boolean tryAgain(){

        System.out.println("Try again? yes/no");
        String response = in.nextLine();
        if (response.equalsIgnoreCase("yes")){
            return chooseNum();
        }else if (response.equalsIgnoreCase("no")){
            return false;
    }else
        return false;
    }
}

我的输出如下:

Enter a number 1 to 10
1
You chose the incorrect number!
Try again? yes/no

Process finished with exit code 0

我似乎无法进一步输入是或否。

我知道这是基本的,我很可能看起来很可怜​​,但我们将不胜感激。

也许另一个菜鸟可以有机会帮助别人:)

非常感谢!

【问题讨论】:

  • 预期输出是什么?
  • 试试do {...} while (true) 而不是...while(false)
  • "while(false)" 实际上是在告诉循环停止循环。您需要将其替换为一些实际情况以进行检查。
  • 其实这里while(false)是正确的,因为它是用递归循环的,而不是while循环。 (PS,不要将递归用作while循环!)
  • 你应该把while循环改成while(tryAgain()),不要在tryAgain中调用chooseNum

标签: java loops do-while


【解决方案1】:

使用 next() 而不是 nextLine(),因为当您读取 int 并添加 \n 以提交值时。 Scanner 将其视为输入。 next() 应该忽略之前输入的 \n 并会按照您的预期接受输入。

【讨论】:

    【解决方案2】:

    您可以通过在方法中创建一个新的扫描仪实例来避免 nextLine 错误。我通过在 chooseNum 和 tryAgain 中声明一个新的 Scanner 对您的代码进行了编辑,这将避免由缓冲输入引起的问题。我希望这有帮助。

    import java.util.Scanner;
    
    public class dowhile {
        public static void main(String[] args) {
            chooseNum();
        }
    
        public static boolean chooseNum() {
            Scanner in = new Scanner(System.in);
            int number = 4;
            do {
                System.out.println("Enter a number 1 to 10");
                int userNum = in.nextInt();
                if (number == userNum) {
                    System.out.println("You chose the correct number!");
                    return tryAgain();
                } else if (number != userNum) {
                    System.out.println("You chose the incorrect number!");
                    return tryAgain();
                } else
                    System.out.println("invalid Response");
            }
            while (false);
            return false;
        }
    
        public static boolean tryAgain(){
            Scanner in = new Scanner(System.in);
            System.out.println("Try again? yes/no");
            String response = in.nextLine();
            if (response.equalsIgnoreCase("yes")){
                return chooseNum();
            }else if (response.equalsIgnoreCase("no")){
                return false;
            }else
                return false;
        }
    }
    

    【讨论】:

      【解决方案3】:

      当您执行return tryAgain(); 行时,chooseNum() 方法结束。这是 return 语句的结果。

      【讨论】:

        【解决方案4】:

        啊,“下一条线”的陷阱……

        当您输入 1 时,STDIN 包含1\n\r。当您调用 nextInt() 时,它会弹出 1,将 \n\r 留在 STDIN 流中。现在,当它调用 nextLine() 来获取下一个输入时,它会读取到下一个\n\r,并返回一个空字符串,因为\n\r 仍然会污染 IN 流。如果您改用 next(),它将忽略 \n\r(和任何其他空格)并为您提供来自 STDIN 的下一个单词。 (您也可以只调用 nextLine() 两次以从 nextInt 调用中清除 \n\r

        这是使用 do-while 的正确方法。

        public static void main(String[] args) {
            chooseNum();
        }
        
        public static void chooseNum() {
            int number = 4;
            do {
                System.out.println("Enter a number 1 to 10");
                int userNum = in.nextInt();
                if (number == userNum) {
                    System.out.println("You chose the correct number!");
                } else if (number != userNum) {
                    System.out.println("You chose the incorrect number!");
                } else
                    System.out.println("invalid Response");
            }
            while (tryAgain());
        }
        
        public static boolean tryAgain(){
            do {
                System.out.println("Try again? yes/no");
                String response = in.nextLine();
                if (response.equalsIgnoreCase("yes")){
                    return true;
                }else if (response.equalsIgnoreCase("no")){
                    return false;
                }else
                    System.out.println("Invalid response.");
                }
            } while(true);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          • 1970-01-01
          • 2016-06-08
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          相关资源
          最近更新 更多