【问题标题】:Why is my exception handling causing an infinite loop?为什么我的异常处理会导致无限循环?
【发布时间】:2016-08-22 18:54:42
【问题描述】:

我正在编写一个返回整数值的方法。在方法中,我通过扫描仪类通过控制台提示用户输入整数。

因为我正在使用扫描仪方法“scan.nextInt()”,所以我也在检查“InputMismatchException”错误。我已将异常处理放在一个循环中,以便如果捕获到异常,则会通知用户并重复循环。这将要求用户继续输入值,直到只输入一个整数值。

但是,我的问题是在它第一次检查错误之后,当它循环回来时,发生了一些事情,并且没有提示用户输入新值并且再次引发异常。这当然会导致无限循环。

我研究并发现了一些与该问题相关的案例,并尝试执行相关修复,但我所做的任何事情似乎都不起作用,而且我不明白到底发生了什么。是否跳过了 try 块?我对 try 块的表示法有问题吗?

public static int inputCheck() {
int check=0;
int money = 0;
while (check==0) {
  boolean error = false;
  System.out.println("Please enter the amount of money your player has.");
  while (true) {
    try {
      money = scan.nextInt();
    }catch (InputMismatchException wrongInput) {
      System.out.println("Error. Please enter an integer value." + wrongInput);
      error = true;
    }
    break;
  }
  if (error==false)
    check++;
  }
return money;
}

EDIT 代码已编辑,“错误”布尔值已调整

【问题讨论】:

  • 为什么会有两个嵌套循环?
  • 考虑使用if(!error) 而不是检查相等性。
  • 您是否尝试过使用调试器单步执行?
  • @Oliver 第二个循环只是我尝试解决此问题的步骤之一。
  • 回复,“我的 IDE 没有调试器?”真的吗?那是什么IDE?谁有胆量称它为 IDE?

标签: java exception-handling infinite-loop


【解决方案1】:

当您将 error 设置为 true 时,问题出在您的 catch 中。一旦 error 设置为 true,您的循环将以无法退出的方式构建,因为 error 永远不会设置为 false,因此 check 永远不会增加。我一般会重新构建这个循环系统,有更好的方法来处理这个。

【讨论】:

  • 好的,我已经解决了这个问题,但是,虽然这解决了潜在的无限循环问题,但我的 try 块似乎仍然被跳过,因为它不会提示用户输入另一个值。
【解决方案2】:

试试这个:

public static int inputCheck() {
    int check = 0;
    int money = 0;

    while (check == 0) {
        boolean error = false;
        System.out.println("Please enter the amount of money your player has.");
        try {
            money = Integer.parseInt(scan.next());
        } catch (Exception e) {
            System.out.println("Error. Please enter an integer value." + e);
            error = true;
        }
        if (error == false) {
            check++;
        }
    }
    return money;
}

【讨论】:

    【解决方案3】:

    while(true) 永远不会为假,因此如果循环未命中 break 语句,则循环永远不会终止

    【讨论】:

    • 循环之后有一个中断,但是为了简单起见,我删除了这个while循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多