2

私は最近、値を文字列変数に代入することで例外を取得する方法があるかどうかを尋ねましたScanner(スレッドはこちら: )

NoSuchElementExceptionそのうちの 1 人は、CTRL+D で aがスローされる可能性があると私に言いました。String を返すため、これは一種の特殊なケースinput.nextLine()であり、String は基本的にユーザーがキーボードで入力できるものであれば何でもかまいinput.nextLine()ません。そのため、例外をスローしても問題ないと思われます。

そこで、私が書いているプログラムにいくつかの try catch ブロックを追加することにしました。これは、プログラムが数値を要求しているときに CTRL+D が押された可能性を考慮して作成したものです。

私が遭遇した問題は、CTRL + D 例外をキャッチしたときに をフラッシュするScanner必要があることですが、 をフラッシュすると、新しい行が存在しないためにScanneraが発生します。NoSuchElementException私はこれを真のループでしばらく使用しているので、岩と難しい場所の間で立ち往生しています。

input.nextLine()コメントアウトして、コードの 1 つのバージョンを投稿します。そのまま実行すると、Scannerフラッシュが必要なときに発生する無限ループが発生します。のコメントを外すとinput.nextLine()、そのコード行自体がNoSuchElementException.

import java.util.NoSuchElementException;



private int getMainOptions(){

    System.out.printf("\n********** Main Options **********");
    System.out.printf("\n*%32s*", "");
    System.out.printf("\n*  %-30s*", "[1] Create Customer");
    System.out.printf("\n*  %-30s*", "[2] Create Reservation");
    System.out.printf("\n*  %-30s*", "[3] Display Customer");
    System.out.printf("\n*  %-30s*", "[4] Display Reservation");
    System.out.printf("\n*%32s*", "");
    System.out.printf("\n**********************************");

    while(true){
        try{

            System.out.print("\nChoose Option: ");

            if(input.hasNextInt()){
                return input.nextInt();
            }

            System.out.print("\nInvalid option");
            input.nextLine();
            continue;
        }

        catch(NoSuchElementException e){
            System.out.print("\nAn exception occurred.");
            //input.nextLine();
        } 
    } 


}

while ループ内で Scanner を作成し、キャッチ内で破棄して次の反復で再作成する以外に、この問題を解決するにはどうすればよいでしょうか?

4

2 に答える 2