【问题标题】:Java User Input - Enter integer within certain range or loop back and try againJava 用户输入 - 输入特定范围内的整数或循环返回并重试
【发布时间】:2016-05-16 15:19:40
【问题描述】:

我必须建立一个用户输入模板,您可以在其中输入100到200之间的数字。如果输入“再见”,则需要退出,如果输入字母,符号,范围之外的数字等需要提示您再试一次。如果您输入范围内的数字,它将转到另一个问题(我没有将其包含在下面的代码中)。

我几乎可以完成所有工作。如果您第一次输入正确的数字,它会起作用。 “再见”和错误字符功能也有效。但是,如果您输入了错误的字符(数字或字母),然后当它提示您重试时,您在范围内输入了一个正确的数字,它不接受它并再次提示您重试。

我需要弄清楚如何输入错误的字符(例如超出范围的字母或数字),然后当它提示您重试并且您输入一个介于 100-200 之间的数字时,它会起作用并退出循环(这将使它能够继续下一个问题/循环)。

这是我的代码:

Scanner console = new Scanner(System.in);
    String Input;
    int Number;
    boolean isValid = true;        
        do {
        System.out.println("Enter a valid number:");
        Input = console.nextLine();
           if (Input.equals("goodbye") || Input.equals("GOODBYE")){
               System.out.println("You have left");
              System.exit(0);
           }
        char[] numberTester = Input.toCharArray();
       for (int i = 0; i<Input.length(); i++){
           Character currentChar = new Character (numberTester[i]);
           if (!currentChar.isDigit(numberTester[i])){
             isValid = false;
             System.out.println("Invalid. Try again.");
              i = Input.length();
           }
           if (isValid == true){
           Number = Integer.parseInt(Input);    
           if (Number < 100 || Number > 200){
             isValid = false;
             System.out.println("Invalid. Try again.");
               }
           }
       } 
        } while (isValid == false);
}
        }

【问题讨论】:

  • 旁白:Java 中的编码约定是变量名以小写字母开头
  • 当输入有效时,您永远不会将 isValid 设置为 true。因此,如果 isValid 设置为 false 一次(如您所说),即使输入有效,它也永远不会退出循环。
  • 你最好使用 String.equalsIgnoreCase() 而不是 String.equals() 两次。此外,您可以将 try-catch 与 Integer.parseInt 一起使用,并完全避免 for 循环。
  • @pdn1227 如果您坚持检查而不是捕获 NumberFormatException,请执行 'char c = input.charAt(i); if (c '9')' 并在 "if (isValid == true)" 之前关闭 for 循环。
  • @cricket_007 是的,我知道。我更改了这篇文章的变量名称以澄清,因为我的名字一开始并不那么具体。只是忘记在发布前取下帽子。

标签: java loops input integer range


【解决方案1】:

我认为这个作业的目的是学习如何处理异常。 parseInt 将抛出 NumberFormatException。使用它来代替 toCharArray 废话。

public static void main(String args[]) {

    Scanner console = new Scanner(System.in);
    String input;
    int number;
    boolean isValid;

    do {
        isValid = true; // reset the validity
        System.out.print("Enter a valid number: ");
        input = console.nextLine();
        if (input.equalsIgnoreCase("goodbye")) {
            System.out.println("You have left");
            System.exit(0);
        }

        try {
            number = Integer.parseInt(input);
            if (number < 100 || number > 200) {
                isValid = false;
                System.out.println("Invalid. Try again.");
            }
        } catch (NumberFormatException e) {
            isValid = false;
            System.out.println("Invalid. Not a number. Try again.");
        }

    } while (!isValid);
}

【讨论】:

    【解决方案2】:

    看起来问题出在这样一个事实,即一旦将 isValid 变量设置为 false,它就永远不会变为 true,因此 do-while 循环将无限循环。

    解决此问题的一种方法是在 do-while 循环的每个循环开始时将 isValid 变量设置为 true,这样如果在循环内没有任何触发它变为 false,则循环将在结束,因为条件不成立。

    【讨论】:

    • 这不是ArcticLord发布的吗?
    【解决方案3】:

    一开始您的isValid 标志设置为true。您的 do-while 循环在此标志为 false 时运行。如果您在第一轮中输入有效的内容,它将退出循环。但是,如果您输入了无效的内容,则将您的标志设置为 false 并且永远不会再返回,因此它会永远循环。
    将 isValid 标志设置为 true 作为 do while 循环中的第一条语句应该可以解决您的问题。

    [...]
    do{
        isValid = true;
        [...]
    } while (isValid == false);
    

    【讨论】:

    • 同样 for 循环应该只包含对数字的检查,否则第二个字符中没有数字的输入将抛出 NumberFormatException。
    • 效果很好,谢谢!它完全符合现在的要求。
    猜你喜欢
    • 2023-04-02
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2020-08-15
    相关资源
    最近更新 更多