(Java)输入验证未按预期工作?

时间:2020-10-03 00:13:06

标签: java loops validation exception input

我正在尝试验证决定程序是否再次执行所有操作或终止的输入。尽管它足以使Y和N成为唯一可接受的答案,但它实际上并没有命中catch语句-由于while循环,它只循环直到输入Y或N。我需要解决此问题,以便其他任何输入都抛出异常,但是我不明白自己做错了什么。

public static String validateChoice(Scanner sc, String choice) {
    choice = "";
    
    while (!choice.equalsIgnoreCase("Y") && !choice.equalsIgnoreCase("N")) {
        try {
            System.out.print("Continue? Y/N: ");
            choice = sc.nextLine();
        } catch (InputMismatchException e) {
            System.out.println("Invalid answer. Please answer only Y or N. Lowercase is accepted.");
            sc.nextLine();
            continue;
        }
        
    } 
    
    return choice;
}

2 个答案:

答案 0 :(得分:0)

因为这里没有错误,所以无法到达catch语句。仅在输入类型不正确时抛出InputMismatchException。例如,您要求输入nextInt(),但输入为double。您正在使用nextLine(),因此接受所有输入。

答案 1 :(得分:0)

问题是您正在捕获InputMismatchException,而tryMi中的代码永远不会抛出该异常。

 System.out.print("Continue? Y/N: ");
 choice = sc.nextLine();

查看此:https://docs.oracle.com/javase/10/docs/api/java/util/Scanner.html#nextLine()

因此,要解决您的问题,请在用户输入Y时继续操作,否则请停止循环播放。依靠价值继续存在并把其他一切都视为“否”是更有意义的。

if(Y){
   continue;
} else { //any other value 
   break;
}

完整代码:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        do {
            System.out.println("Do some stuff");
        } while (continueCheck(sc));

        System.out.println("Completed");
    }


    public static boolean continueCheck(Scanner sc) {
        System.out.print("Continue? Y/N: ");
        String choice = sc.nextLine();
        return "Y".equalsIgnoreCase(choice.trim());//true only if Y or y is entered

    }

相关问题