尝试捕捉选择菜单

时间:2016-12-26 21:39:50

标签: java while-loop menu try-catch

我在while循环中做了一个选择菜单。为了确保用户输入有效的选项,我将菜单本身放在try catch块中:

如果捕获到异常,我希望用户获得新的机会,所以我将try-catch块放在while(true)循环中。但是,使用这种循环时,编码操作的部分将成为无法访问的代码。

有没有办法更好地做到这一点?

另外一个问题,我如何阻止用户输入不存在的选项?

while (choice != 0) {
    /* Ask for player's choice */
    while(true) {
        try
        {
            BufferedReader menuInput = new BufferedReader(new InputStreamReader(System.in));
            System.out.println();
            System.out.println("Please choose between the following options:'");
            System.out.println(" (1) Make new animal");
            System.out.println(" (2) Feed Animals");
            System.out.println(" (3) Count animals");
            System.out.println(" (0) Quit");
            System.out.print("Enter your choice: ");;
            choice = Integer.parseInt(menuInput.readLine());
        } catch (NumberFormatException ex) {
            System.err.println("Not a valid number");
        } catch (IOException e) {
            System.out.println("Failed to get input");
        }
    }
    // first choice option:
    if (choice == 1) {
        //actions
    }
    // second choice option:
    if (choice == 2) {
        //actions
    }
    // third choice option:
    if (choice == 3) {
        //actions
    }
}
System.out.print("Thank you for playing!")

1 个答案:

答案 0 :(得分:2)

最简单的方法是在循环上方设置一个布尔标志:

boolean waitingForAnswer = true;

然后只需将while循环条件更改为while(waitingForAnswer),并在接受一个waitingForAnswer后将false设置为if

然后,您可以使用相同的结构来阻止它们输入5或其他任何内容。只需在那里标记一个waitingForAnswer,检查该值是否为已接受的值,如果不是,则不要更改if

编辑: 顺便提一下,底部的if (choice==1)语句字符串效率不高。如果用户输入“1”,那么else if块将触发,然后它将继续检查它是否等于2,如果它等于3,等等,当我们知道它不会。在那里使用ZonedDateTime.parse ( "Thu Jan 01 00:00:00 GMT 1970" , DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss zzz uuuu" , Locale.CANADA ) )

另一个编辑: 另外,在循环外创建输入流阅读器。目前,每次循环运行时都会创建一个新的。