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

ここで、入力が許可された選択肢の範囲外にある場合、つまり、選択肢 1 と 2 の入力 7 の場合に例外をキャッチしたいと考えています。

このために、InvalidInputException を使用してみましたが、「import.java.Throwable/Exception;」をインポートしたにもかかわらず、「シンボル InvalidInoutException が見つかりません」というコンパイル エラーが発生します。

4

3 に答える 3

4

「InvalidInputException」用に定義されたカスタム例外クラスはありますか? そうでない場合は、カスタム例外クラスを作成するためのこの投稿を参照してください。

Javaでカスタム例外クラスを定義する方法、最も簡単な方法は?

于 2013-10-04T20:32:33.677 に答える
4

のようなものはありませInvalidInputExceptionjava.lang。独自のカスタム例外を作成し、必要に応じて名前を付ける必要があります。

申し訳ありませんが、コードから判断すると、Java で例外処理がどのように機能するかについて十分な知識がありません。これが例外の慣習である場合は、それに応じてコードをリファクタリングしてください。そうでない場合は、例外をまったく使用しないでください。このコード スニペットでは必要ありません。

于 2013-10-04T20:34:23.483 に答える
0

私はインポートを調べませんでしたが、問題は InvalidInputException の前に Exception をキャッチすることです。Java は最初に一致した catch を使用して例外を処理するため、そのサブクラスの前でスーパークラスをキャッチすると、サブクラスの catch は発生しません。

キャッチの順序を逆にすると、運が良くなります。

編集:OK、私はそれを調べましたが、 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 に答える