【问题标题】:(Java) Input validation not working as intended?(Java) 输入验证未按预期工作?
【发布时间】:2021-01-18 14:26:56
【问题描述】:

我正在尝试验证决定程序是否再次执行所有操作或终止的输入。虽然 Y 和 N 是唯一被接受的答案,但它实际上并没有命中 catch 语句——它只会循环直到输入 Y 或 N 因为 while 循环。我需要解决这个问题,以便为任何其他输入引发异常,但我不明白我做错了什么。

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;
}

【问题讨论】:

  • Scanner.nextLine 不会抛出 InputMismatchException
  • 由于给出的答案,我找到了一种方法来完成我正在寻找的东西。谢谢!

标签: java loops validation exception input


【解决方案1】:

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

【讨论】:

  • 我明白了。因此,我最好将 if 嵌套在 do while 中。谢谢!
【解决方案2】:

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

 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

    }

【讨论】:

  • 在这两种情况下我都需要考虑 Y 和 N,但我非常感谢您的解释!你帮了很多忙,我可以看到一种方法,用 do while 和 if 语句来做到这一点。 :)
  • 它是一个二元选择。真或假。如果 Y -> TRUE ,如果还有其他 FALSE ...您真的不需要检查 else 部分..可能是您没有解释为什么需要它
猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多