【问题标题】:While loop goes infinite when moving back an iteration移回迭代时,while循环变为无限
【发布时间】:2020-10-27 21:51:54
【问题描述】:

使用 while 循环提示用户输入 3 个整数来平均它们,当输入不是整数时需要重新提示,所以我决定在输入不是整数时后退一步int,但是当我输入一个非 int 时,就好像它一直处于它不是 int 的状态,并继续重新提示,而不重新检查新的输入。

  Scanner scnr = new Scanner(System.in);

    String prompt = "Type an integer: ";
    int num = 0;
    int i = 0;
    while (i < 3) {
        System.out.print(prompt);
        if (scnr.hasNextInt()) {
            int input = scnr.nextInt();
            num += input;
        } else i -= 1;

        i += 1;
    }
    
     double average = num / 3.0;
    System.out.println("Average: " + average);

【问题讨论】:

  • hasNextInt() 仅检查下一个标记是否为 int。它没有前进,所以 not-int 仍然存在。当扫描器检查下一次迭代时,它检查相同的令牌。您必须致电 next()nextLine() 才能实际获取令牌。
  • 它进入条件“它不是一个 int”,因为只有当你已经有一个 int 时你才调用 scnr.nextInt(),并且你永远不会离开你的 while 循环,因为当 i 低于 3并且您没有 int,您将 1 模式减去 i :-1、-2、-3...所以您永远不会离开循环。

标签: java while-loop


【解决方案1】:

hasNextInt() 仅在 int 已经存在的情况下返回 true - 它实际上并没有获得输入。这就是您拨打nextInt() 所做的事情。但这永远不会被调用,因为 hasNextInt() 始终为 false,因为您实际上从未接受过用户输入,因此 ielse 块中递减,然后再次永远递增。

另一种方法是使用带有 nextInt() 的 try/catch 块来获取下一个输入值,如果捕获到异常(意味着输入不是 int)则后退。

【讨论】:

  • 我尝试了 try/catch,但它仍然会导致它进入无穷大,不过我可能写错了。
  • 您需要将nextInt() 调用放在try 块中,并将i-- 放在catch 块中。这样,如果在尝试读取用户输入的 int 时发生任何异常(错误),它将简单地跳转到 catch 块,递减 i 并再次循环。
【解决方案2】:

正如以前的用户所提到的,主要问题是 hasNextInt() 只检查而不是向前推进您的扫描仪。

以下是我将如何执行此代码,希望它能解决问题:

    int counter = 0;
    boolean flag = false;
    int sum = 0;

    while(!flag){

        System.out.println(prompt);

        if (scnr.hasNextInt()){
            int input = Integer.parseInt(scnr.nextLine());
            sum = sum + input;
            counter++;
        }else{
            scnr.nextLine();
            System.out.println("You didn't enter an Integer.");
        }
        
        if (counter == 3){
            flag = true;
        }

    }

    double avg = sum / 3;
    System.out.println("Average: " + avg);

可能有比我更好的方法,但我希望它有所帮助,祝你好运!

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2014-10-31
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多