質問

私はユーザー入力値をスキャンするビットのコードを実行しようとしています。このアクションは、gettriangledim()という名前のカスタムメソッドに含まれています。メソッドはUser Int値を読み込み、それが一定の範囲内にあることを確認してから、入力されたint値を返します。この方法はうまく機能し、私はそれに問題がありません。

gettriangleDim()メソッドにint以外の値を入力すると、問題が発生します。それは私にInputMismatchExceptionエラーを与えます。この問題を解決しようとするために、Try-CatchステートメントをDO-WHILEループに書きました。しかし、これは私が今までtry-catchの声明を使ったことがあるのは初めてです、そして私は明らかに何かを欠いています。

DO-whileループ内にネストされたtry-catchステートメントのコード:

//loop to scan for triangle dimension
        boolean bError = true;
        int triangle;

        do{
            try {
                triangle = getTriangleDim();
                bError=false;
                }
            catch (Exception e){
                System.out.println("You did not enter an integer, please enter an integer value");
                triangle = getTriangleDim();

                }
        }while (bError);
.

INTの代わりにCHAR値を入力してテストした場合は、実際にはエラーが一度キャッチされてから、「しなかった」ステートメントを印刷します。しかし、もう1つのint以外の番号を再入力した場合、私はそれを推測した........ InputMismatchExceptionエラー。

私の方法のコードはこちら:

//method for scanning triangle dimensions from keyboard
    public static int getTriangleDim(){
        int triangle = 0;
        Scanner keyboard = new Scanner(System.in);
        do{
        System.out.print("Enter a non-zero integer length (+/-1 - +/-16): ");
        triangle = keyboard.nextInt();
        if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)))
            System.out.println("Inpute value outside of range");
        }while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)));
        return triangle;
    }
.

続行するにはDO-WHILEループが必要ですが、これらのエラーが発生し続けます。

役に立ちましたか?

解決

catchブロックで入力を求める必要はありません。あなたはすでにループに入っているので、例外を引くことができ、あなたに有効な入力を与えるようにユーザーに伝えてください、そしてそれ以外のことをする必要はありません - あなたは先頭に戻って回ってください。

do{
    try {
        triangle = getTriangleDim();
        bError=false;
    } catch (Exception e){
        System.out.println("You did not enter an integer, please enter an integer value");
        // Don't do anything else in here: we will loop back to the beginning again and get new input!
    }
}while (bError);
.


サイドノートとして(そして気づいたとおり)、triangleのため、そのtryブロックの外側に"triangle might not have been initialized"を使用しようとすると、コードは現在コンパイルされません。これは、コンパイラが、プログラムが実行時に行うものであることを判断できません。 / a>:つまり、Compilerは、triangleが常にそのループ内で初期化されることを確認できません。したがって、変数宣言は、triangleもいくつかのデフォルト値に設定する必要があります。 0intの通常のデフォルトですが、プログラムで意味があるものは何でも使用します(0コードに基づいて、getTriangleDimのように見えます)。

int triangle = 0;
do { // etc.
.

このように、triangleがループを残すまでに値を持つようになるコンパイラを "推奨"できること、そしてあなたはそれを他の場所で使うことができるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top