【问题标题】:Endless java loop while taking an input输入时无休止的java循环
【发布时间】:2014-07-04 21:51:48
【问题描述】:

我在这里的while循环有这个问题:

while((input = InputHandler.getInt()) != 1 && input != 2){
        if(input == InputHandler.CODE_ERROR)
            System.out.print("Input must be a number");
    }

这个 while 循环只接受一次输入并且不会再次请求它,因此它会在整个时间内循环输入一次。我在这里做错了什么,因为对我来说,这个诡计循环的工作真的很奇怪?

InputHandler 类:

public class InputHandler {
  public static Scanner in = new Scanner(System.in);
  public static int CODE_ERROR = -6;

  public static int getInt(){
    try{
        return in.nextInt();
    } catch(InputMismatchException e){
        return CODE_ERROR;
    }
  }
}

【问题讨论】:

  • 只有当input 同时 等于 1 和 2 时,您的循环才会终止。这不会发生。对于任何值,either input != 1 or input != 2 将是真的......我怀疑你想要&&
  • 代码现在好像已经更新了。
  • @JonSkeet 是的,谢谢这个,现在它至少可以为正确的答案工作,但它仍然不能修复无效的答案无限循环状态,可以这么说。
  • 我刚刚运行了现有的代码 - 似乎工作正常?
  • 如果我提供了无效的输入,我会得到一个无限循环。

标签: java loops while-loop infinite-loop


【解决方案1】:

目前,如果在命令行输入非整数,您的代码将进入无限循环。这是因为您的 in.nextInt() 方法引发了异常并且将违规值留在了扫描仪中

您需要通过调用in.next(); 来消耗导致异常的无效令牌:

public static void main(String[] args) throws Exception {
    int input;
    while ((input = InputHandler.getInt()) != 1 && input != 2) {
        if (input == InputHandler.CODE_ERROR)
            System.out.print("Input must be a number");
    }
}

public static class InputHandler {
    public static Scanner in = new Scanner(System.in);
    public static int CODE_ERROR = -6;

    public static int getInt(){
      try{
          return in.nextInt();
      } catch(InputMismatchException e){
          in.next();  // <------------------ this should solve it
          return CODE_ERROR;
      }
    }
  }

【讨论】:

    【解决方案2】:

    我运行的代码运行良好,每次都要求输入,当我给出 2 或 1 个循环终止时。这是我运行的代码示例:-

       package testing;
    
    import java.util.InputMismatchException;
    import java.util.Scanner;
    
    public class Test123 {
        public static Scanner in = new Scanner(System.in);
        public static int CODE_ERROR = -6;
    
        public static int getInt(){
            try{
                String in1 = in.next();
                 return Integer.parseInt(in1);
                //return in.nextInt(); <-- This is leading to error
            } catch(Exception e){
                return CODE_ERROR;
            }
    }
    
        public static void main(String[] args) {
            int input;
    
            while((input = Test123.getInt()) != 1 && input != 2){
                if(input == Test123.CODE_ERROR)
                    System.out.print("Input must be a number");
    
                System.out.println("\nWrong number: "+input+" Please try again.");
    
    
                //input = Test123.getInt();
            }
        }
    
    }
    

    我不明白你为什么遇到问题?

    【讨论】:

    • while 循环中的条件在每次循环时都会被评估,所以这应该不是问题。
    • Evan Knowles:- 编辑过的帖子...抱歉之前的可疑评论。
    • @Vitalij Kornijenko:- 你能指出我是否有任何错误,而你想要一些不同的东西。因为对我来说它工作正常。
    • @108 问题是当我输入一个无效的答案时:3,99,g 它进入一个无限循环而不是再次接受输入。
    • @VitalijKornijenko :- 现在我看到了你的问题。看到你已经明确指定了 in.nextInt()。哪个正在寻找 int。所以它得到了例外。但是标准输入流仍然有字符。所以循环返回并尝试读取相同的字符属于异常。从而导致无限循环。
    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 2019-08-17
    • 2019-06-26
    • 2021-12-30
    • 1970-01-01
    • 2019-11-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多