2

我有一个读取整数作为输入的菜单,这里是菜单的方法:

public int menu(String _menuHeader,String[] _menuItems) throws InvalidInputException {
    int choice = 0;
    do {
        try {
            scanner.nextLine();
            System.out.println(_menuHeader);

            for (int i = 0; i < _menuItems.length; i++) {
                System.out.println(" " + (i + 1) + " " + _menuItems[i]);
            }

            choice = scanner.nextInt();

            if (choice <= 0 || choice > _menuItems.length) {
                throw new InvalidInputException();
            }
        } catch (Exception e) {
            System.out.println("Enter valid input");
            validInput = false;
        } catch (InvalidInputException e) {
            System.out.println("Please enter a choice between 1 and" + _menuItems.length);
            validInput = false;
        }
    } while (!validInput);
}

现在我想在输入超出允许选择范围时捕获异常,即输入 7 用于选择 1 和 2,

为此,我尝试使用 InvalidInputException,但这会导致编译错误为“找不到符号 InvalidInoutException”,尽管我已导入“import.java.Throwable/Exception;”

4

3 回答 3

4

您是否为“InvalidInputException”定义了自定义异常类?如果没有,请阅读这篇文章来创建自定义异常类。

如何在 Java 中定义自定义异常类,最简单的方法?

于 2013-10-04T20:32:33.677 回答
4

中没有这样的InvalidInputException东西java.lang。您必须创建自己的自定义异常,并根据需要命名。

很抱歉这么说,但是从您的代码来看,您对 Java 中异常处理的工作原理知之甚少。如果这是异常做法,请相应地重构您的代码。如果没有,请不要使用异常。在这段代码中您不需要它们。

于 2013-10-04T20:34:23.483 回答
0

我没有查找导入,但问题是您在 InvalidInputException 之前捕获了异常。Java 使用第一个匹配的 catch 来处理异常,因此如果您在其任何子类之前捕获超类,则子类捕获将永远不会发生。

颠倒你的捕获顺序,你会有更好的运气。

编辑:好的,我确实查过了, Scanner.nextInt() 无论如何都不会抛出那个异常。您可能想要java.util.InputMismatchException,但请自己检查:

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28%29

PS:顺便说一句,这确实不是处理无效输入的最佳方法。该类Scanner有一个hasNextInt()方法来检测输入流中是否下一个有效整数。通常,如果有明智的选择,最好避免抛出和捕获异常。这些Scanner hasNext*方法专门设计用于为您提供那些明智的选择。

于 2013-10-04T20:34:14.777 回答