我怎样才能让用户在 Java 中输入数字并重试?

How can I make the user just enter numbers and try again in Java?

提问人:Agustin Medrano 提问时间:5/20/2021 更新时间:6/9/2021 访问量:890

问:

该程序应该按如下方式工作,程序要求输入一个数字,用户必须输入它,如果用户输入一个字母、一个小于 0 的数字或没有输入任何东西,将出现错误,它会告诉用户重试,给用户无限的尝试。

我已经尝试过了,但我只在捕获中得到了一个无限循环,我将不胜感激。

public static void numbers(){
        Scanner in = new Scanner(System.in);
        int number;
        
        System.out.print("Enter only numbers: ");
        while(true){
            try {
                number = in.nextInt();
                if(number > 0){
                    break;
                } else {
                    System.out.print("Try again: ");
                }
            } catch (Exception e){
                System.out.print("Try again: ");
            }
        }
java while-loop try-catch java.util.scanner

评论


答:

1赞 Hamlet Leon 5/20/2021 #1

首先,这不是 stackoverflow 的目的。但我会帮助你。

如果您与其他 cmd 进程进行比较,它们总是会要求 y/N 答案。所以:

public static void numbers(Scanner overrideIn = null){
    Scanner in = overrideIn ?? new Scanner(System.in);
    int number;
    
    System.out.print("Enter only numbers: ");
    while(true){
        try {
            number = in.nextInt();
            if(number > 0){
                break;
            } else {
                System.out.print("Try again: ");
                this.TryAgain(in);
            }
        } catch (Exception e){
            System.out.print("Try again: ");
            this.TryAgain(in);
        }
    }
public static void TryAgain(Scanner in)
{
    char respond = in.next().charAt(0);
    if (respond == 'y')
    {
        this.numbers(in);
    } else {
        System.out.print("See ya!");
    }
}
1赞 Piotr 5/20/2021 #2

我认为问题在于,如果输入实际上不是整数,它就会留在扫描仪中。扫描仪根本不会前进到下一行或其他东西。

因此,这个无效的整数会阻止您访问更多内容,即使它是一个数字。

从 java 文档:

如果无法将下一个标记转换为有效的 int 值,则此方法将引发 InputMismatchException,如下所述。如果转换成功,扫描仪将前进到匹配的输入之外。

因此,对于不成功的转换,有问题的行 STAYS,以及下一次对 nextInt 方法的调用也将失败,尝试解析有问题的行。因此,您的无限循环。

2赞 Elle Do 5/20/2021 #3
public static void main(String[] args) throws IOException{
    BufferedReader var = new BufferedReader(new InputStreamReader(System.in));        
    boolean response = false;
    
    while (!response) {  
        try {
            System.out.println("Input number: ");
            String input = var.readLine();
            int n = Integer.parseInt(input);
            response = true;
        } catch (Exception e) {
            response = false;
        }
        
    }
    
    
}

评论

0赞 Elle Do 5/20/2021
为您找到了一个简单的解决方案。希望对你有帮助。
1赞 Samudra Ganguly 5/21/2021 #4
Scanner sc = new Scanner(System.in);
int n = 0;
while (n == 0) {
    String s = sc.nextLine();
    try {
        n = Integer.parseInt(s);
    }
    catch(Exception e) {
        System.out.println("Try again");
    }
}
0赞 FairOPShotgun 6/5/2021 #5

这是您问题的答案:

import java.util.Scanner;
class test {
  public static void numbers(){
    while(true){
      Scanner userInteraction = new Scanner(System.in);
      System.out.print("Enter only numbers: ");
      String userInput = userInteraction.nextLine();    
      if (userInput.matches("\\d+$")){
        double userNum = Integer.parseInt(userInput);
        System.out.println("Congrats! You typed a number!");
        break;
      } else {
        System.out.println("GRRR! You didn't type a number!");
        continue;
      }
    }
  }
  public static void main(String[] args) {
    numbers();
  }
}

输出

Output

工作原理:

为了检查 userInput 是否为数字,您需要使用正则表达式(或 REGular EXpression)。我使用了正则表达式匹配器。更多信息 这里这里!在验证 userInput 是一个数字(使用正则表达式匹配器)后,我使用该函数将 String 更改为 Integer。然后,我会祝贺玩家和循环。如果玩家没有输入数字,我会警告玩家和循环。\\d+$Integer.parseInt(userInput)break;continue;

评论

0赞 tucuxi 6/6/2021
当复制和粘贴文本就足够时,您不应该使用屏幕截图。此外,没有必要写“如果这不是您想要的结果,请发表评论。我会修改我的答案并提供你需要的东西。
0赞 FairOPShotgun 6/6/2021
如果这不是他们想要的结果怎么办.-。他们会投反对票,我将无法帮助他们。
0赞 tucuxi 6/7/2021
人们通常会解释他们的反对票。此外,查看您的代码,最好不要在循环的每次迭代中创建一个 Scanner,而是重用同一个 Scanner。从这个意义上说,萨穆德拉的答案更清晰。
0赞 FairOPShotgun 6/7/2021
凉。我还没有了解,所以我没有在我的答案中使用它。try..catch