【问题标题】:Java: Easier Way to Re-prompt user for input when invalid data is enteredJava:输入无效数据时重新提示用户输入的更简单方法
【发布时间】:2013-06-05 06:14:42
【问题描述】:

我正在使用 java 语言创建一个简单的程序,它使用一堆类似的方法从用户那里检索信息。我用来处理用户输入无效数据的方法对我来说似乎很不正确,所以我正在寻求有关如何更好地处理无效数据的专业指导。

我试图搜索类似的问题,但没有找到。

这是我的一种方法的示例:

public static int getInput()
{
    int temp = 1;

    do
    {
        System.out.println("Answers must be between 1 and 15");
        temp =  reader.nextInt();

        if(temp >=1 && temp <= 15)
        {
            return temp;
        }
        else
        {
            System.out.println("Please enter a valid value");
        }
    }while(temp > 15 || temp < 1);

    //This value will never be reached because the do while loop structure will not end until a valid return value is determined
    return 1;
}//End of getInput method

有没有更好的方法来写这个方法?

这个问题完全是虚构的,所以我可以学习更好的方法来在我未来的程序中实施。

是否可以使用带标签的 break 语句?如:

public static int getInput()
{
    int temp = 1;

    start:

        System.out.println("Answers must be between 1 and 15");
        temp =  reader.nextInt();

        if(temp >=1 && temp <= 15)
        {
            return temp;
        }
        else
        {
            System.out.println("Please enter a valid value");
            break start;
        }


}

提前非常感谢您。

【问题讨论】:

  • 看起来不错。顺便说一句,你为什么不为此使用 GUI? awt/swt/swing....?在这种情况下,您有很多选择。一个是 InputVerifier - stackoverflow.com/questions/12997742/…
  • @Jayan 我只是想学习一个新概念;不需要 GUI 来说明问题。必须有更好的方法来做到这一点,最后一个 return 语句永远不会到达,并且 temp 检查它是否在允许的值内两次...编辑:对不起,我没有注意到最后一句话;我想在没有 GUI 的情况下执行此操作。

标签: java


【解决方案1】:

您忘记检查是否输入了非数字值(Scanner#nextInt 抛出 java.util.InputMismatchException)。解决该问题的一个建议是更少冗余且更灵活:

public static int getInput(int min, int max) {
    for (;;) {
        Scanner scanner = new Scanner(System.in);
        System.out.println(String.format("Answers must be between %s and %s", min, max));
        try {
            int value = scanner.nextInt();
            if (min <= value && value <= max) {
                return value;
            } else {
                System.out.println("Please enter a valid value");
            }
        } catch (InputMismatchException e) {
            System.out.println("Input was no number");
        }
    }
}

【讨论】:

  • 感谢您的回答。我喜欢使用“for(;;){}”,我不知道这是可能的。 :)
  • 我有问题;当 InputMismatchException 被捕获时,“input was no number”消息被无限打印出来......我该如何防止这种情况?
  • 奇怪,对我来说很好,刚刚检查过。确保在 inside 循环中实例化 Scanner。
  • 哦,好吧,那是我的错误。再次感谢!有什么办法可以避免在循环内实例化扫描仪?我问是因为我有 12 种类似的方法;在每一个中都实例化扫描仪是不是很糟糕?
【解决方案2】:

如果您只是担心未使用的退货并仔细检查 temp,您可以执行类似的操作

public static int getInput()
{
    while(true)
    {
        System.out.println("Answers must be between 1 and 15");
        temp = reader.nextInt();

        if(temp >=1 && temp <= 15)
        {
            return temp;
        }
        else
        {
            System.out.println("Please enter a valid value");
        }
    }
}//End of getInput method

【讨论】:

  • 感谢您的帮助:)
猜你喜欢
  • 2013-09-14
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多