试图提示用户重新进入catch块,但是catch块终止了吗?

时间:2018-09-18 00:05:27

标签: java exception exception-handling try-catch inputmismatchexception

我正在尝试编写一个程序,要求用户输入年龄,并提示他们是否输入错误的值(例如,负数,大于120,带有特殊字符或字母的年龄,超出范围的数字,等等...)

我尝试编写一次try / catch来要求用户重新输入年龄:

System.out.println("Enter your age (a positive integer): ");
    int num;

    try {
        num = in.nextInt();
        while (num < 0 || num > 120) {
            System.out.println("Bad age. Re-enter your age (a positive integer): ");
            num = in.nextInt();
        }
    } catch (InputMismatchException e) {
        //System.out.println(e);
        System.out.println("Bad age. Re-enter your age (a positive integer): ");
        num = in.nextInt();
    }

当输入的年龄包含特殊字符/字母或超出范围时,程序会打印出“年龄不正确。请重新输入您的年龄(正整数)”字样,但是此后此错误立即终止:

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at Age.main(Age.java:21)

我的目标是使程序继续提示有效年龄,直到用户正确为止。 我非常感谢任何反馈和帮助。我是Java初学者:) 谢谢

我试图更改将整个代码放入while循环,但随后导致无限循环...请帮忙!

while (num < 0 || num > 120) {
        try {
            System.out.println("Bad age. Re-enter your age (a positive integer): ");
            num = in.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Bad age. Re-enter your age (a positive integer): ");
        }
    }

2 个答案:

答案 0 :(得分:1)

由于您尝试捕获无效的输入状态,同时仍提示用户输入正确的值,因此try-catch应该封装在loop中,作为验证过程的一部分。

使用nextInt读取输入时,不会删除无效输入,因此您将需要确保在尝试使用nextLine重新读取缓冲区之前先清除缓冲区。或者,您也可以放弃它,而直接使用String来读取nextLine的值,然后使用int将其转换为Integer.parseInt,这对个人而言就不那么麻烦了。 / p>

Scanner scanner = new Scanner(System.in);
int age = -1;
do {
    try {
        System.out.print("Enter ago between 0 and 250 years: ");
        String text = scanner.nextLine(); // Solves dangling new line
        age = Integer.parseInt(text);
        if (age < 0 || age > 250) {
            System.out.println("Invalid age, must be between 0 and 250");
        }
    } catch (NumberFormatException ime) {
        System.out.println("Invalid input - numbers only please");
    }
} while (age < 0 || age > 250);

使用do-while循环,基本上是因为,即使在第一次通过时,对于有效值,您也必须至少迭代一次。

答案 1 :(得分:0)

即使您能够提示用户重新输入年龄,您也将无法检查之后的输入是否正确。因此,我建议像您一样使用简单的while循环,但不要只寻找一个数字范围,而是在尝试将其解析为int之前检查它是否是一个数字。

如果使用input.nextLine()。trim();例如,您可以使用StringUtils.isNumeric之类的方法,也可以实现自己的方法以返回一个布尔值,该布尔值指示输入是否为数字。