如何解决 for 循环中的 try-catch 问题?

how can I resolve try-catch issue within for loop?

我的代码快完成了。这是一个猜数字的游戏。最后一部分是实现 try-catch 函数,以便程序捕获无效输入,例如大于 50 的数字或输入字母或任何符号。

代码如下:

import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);

        //number generator
        int number = 1 + (int)(50 * Math.random());

        int i, guess;
        int g = 50;


        for (i = 0; i < g; i++) {
            try {
                System.out.println("Guess a number between 1 to 50!");

                guess = s.nextInt();


                if (guess == number) {
                    System.out.println("You got it in " + i + " tries.");
                    System.out.println("The number was: " + number);
                    break;
                } else if (guess < number) {
                    System.out.println("Too low. Try Again.");
                } else if (guess > number) {
                    System.out.println("Too high. Try Again.");
                }
            } catch (Exception e) {
                System.out.println("Oops you entered an invalid input. Try Again.");
            }
        }
    }
}

所以我们不要谈论干净的代码,我只是想更正您的 catch 子句。

主要问题是,如果 .nextInt() 是无效输入,扫描器不会消耗它。

这意味着在捕捉到你的异常之后,该行仍然存在,并将在你的下一次迭代中自动再次读取。从理论上讲,这将以无限循环结束,但由于您的结构,您的循环受到 int g = 50;.

的限制

我知道的唯一(而且不是那么干净)解决方案是,让扫描器简单地使用 .nextLine().next().

来处理下一行

@Chaosfire 提到的解决方案要好得多。

guess = Integer.parseInt(s.nextLine());

您将首先阅读该行,无论其内容是什么。之后您尝试将内容解析为整数。如果输入无效,该方法将抛出一个 NumberFormatException,您可以在 catch 子句中捕获它。

循环建议

for(i = 0; i < g; i++) {
  System.out.println("Guess a number between 1 to 50!");
  try {
    guess = Integer.parseInt(s.nextLine());

    if((guess < 1) || (guess > 50)) {
      throw new Exception("Integer is not in Range between 1 and 50");
    }
    if(guess == number) {
      System.out.println("You got it in " + i + " tries.");
      System.out.println("The number was: " + number);
      break;
    }
    else if(guess < number) {
      System.out.println("Too low. Try Again.");
    }
    else if(guess > number) {
      System.out.println("Too high. Try Again.");
    }
  }
  catch(Exception e) {
    i--;
    System.out.println("Oops you entered an invalid input: " + e.getMessage() + "\nTry Again.");
  }
}