2016-03-31 12 views
1

これは私がちょうど見つけられない単純なものだと確信しています。プログラムの残りの部分で使用される配列サイズのユーザーを促すdo whileループがあります。ユーザーが右の入力を入力した場合、プログラムは続行され、正常に動作しますが、ユーザーは、このような「赤」、catchブロックとして間違って入力...Do-whileループはユーザー入力を待っていませんか?

public static void main(String[] args) 
{ 
    // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user has not entered any numbers yet 
    // display an error message, otherwise, display each entered value and it's distance from the average 

    Scanner keyboard = new Scanner(System.in); 
    int arraySize = 0; 
    boolean isValid = false; 

    do 
    { 
    isValid = true; 
    arraySize = 0; // reset these values at start of each loop. 

    System.out.println("Enter an array size."); 
    try { 
     arraySize = keyboard.nextInt(); 
    } 
    catch(NegativeArraySizeException mistake) { 
     System.out.println("Do not enter a negative number for the arrays size."); 
     System.out.println(); 
     isValid = false; 
    } 
    catch(InputMismatchException mistake) { 
     System.out.println("Make sure to enter a valid number."); 
     System.out.println(); 
     isValid = false; 
    } 
    } while (isValid == false); 

ユーザーが無効な入力を入力した場合に、入力した場合キックインして印刷します。「有効な番号を入力してください」配列サイズを入力してください。ユーザーに実際に入力を入力する機会を与えずに何度も繰り返します。私はarraySize変数をリセットするとそれを修正すると考えましたが、そうではありません。私は、キーボードのバッファーはそれにものを持っていると思うが、空のprintlnsの組み合わせはこれまで働いていない。

ユーザー入力の検証に例外を使用しないでください。何故ですか?

それにかかわらず、例外処理の練習であるので、この質問には関係ありません。

+0

mmuzahidがほとんど存在してみてください。私は、入力値の否定性をチェックする方法を追加しました。チェックしてください –

答えて

1

数値書式例外を取り扱います。例外が発生した場合は、問題を解決する必要があります。

try { 
    arraySize = keyboard.nextInt(); 
} 
catch(NegativeArraySizeException mistake) { 
    System.out.println("Do not enter a negative number for the arrays size."); 
    System.out.println(); 
    isValid = false; 
    keyboard.nextLine(); 
} 
catch(Exception mistake) { 
    System.out.println("Make sure to enter a valid number."); 
    System.out.println(); 
    isValid = false; 
    keyboard.nextLine(); 
    } 
+0

それはそれを修正しました。私はちょうど追加の印字線を追加すると、キーボードバッファをクリアする方法ではなかったと思っていました。それは追加のnextLinesを追加しています。睡眠不足が再び襲う。 –

2

isValidブール変数を使用せずに入力用の簡単なコードを作成します。

int arraySize = 0; 
do { 
    System.out.println("Enter a valid array size."); 
    try { 
     arraySize = Integer.valueOf(keyboard.nextLine()); 
     if (arraySize < 0) throw new NegativeArraySizeException();// for negative arry size 
     break;// loop break when got a valid input 
    } catch (Exception mistake) { 
     System.err.println("Invalid input: " + mistake); 
    } 
} while (true); 
+0

"壊れますか?"これまでに何か問題が発生した?私は、「goto」などのようなものが問題を引き起こす可能性があることを知っています。もしそうでなければ、それは "無限"のループを設定するための本当にエレガントな方法のように思えます。そして、私はそのような問題の解決策として私を採用します。 –

+1

@SpaceOstrich Javaには '' goto''がありません。配列の大きさを設定するために有効な非負の整数がある場合、ループ出口として '' break''文を使用しました。私は間違っているかもしれませんが、このようにしてコードを減らして、有効な入力を得ることができます。 – mmuzahid

0

この修正プログラムが適用されるかどうかを確認してください。 nextInt関数から文字列を取得しようとすると、Scannerに問題があります。これで私は、文字列をフェッチしているし、整数に解析され、その後、あなたはkeyboard.nextLineを()を追加することができます

public static void main(String[] args) { 
    // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user has not entered any numbers yet 
    // display an error message, otherwise, display each entered value and it's distance from the average 

    Scanner keyboard = new Scanner(System.in); 
    int arraySize = 0; 
    boolean isValid = false; 

    do { 
     isValid = true; 
     arraySize = 0; // reset these values at start of each loop. 

     System.out.println("Enter an array size."); 
     try { 
      arraySize = Integer.parseInt(keyboard.next()); 
     } catch (NegativeArraySizeException mistake) { 
      System.out.println("Do not enter a negative number for the arrays size."); 
      System.out.println(); 
      isValid = false; 
     } catch (InputMismatchException mistake) { 
      System.out.println("Make sure to enter a valid number."); 
      System.out.println(); 
      isValid = false; 
     } catch (NumberFormatException nfe) { 
      System.out.println("Make sure to enter a valid number."); 
      System.out.println(); 
      isValid = false; 
     } 

    } while (isValid == false); 
} 
0

mmuzahidがほぼあります。しかし、私は負の数をチェックする方法も加えました。この

Scanner keyboard = new Scanner(System.in); 
    int arraySize = 0; 
    boolean isValid = false; 
    do { 
     System.out.println("Enter a valid array size."); 
     try { 
      arraySize = Integer.valueOf(keyboard.nextLine()); 

      if (arraySize < 0) { 
       System.out.println("Make sure to enter a valid positive number."); 
      } else { 
       break; 
      } 
     } catch (Exception mistake) { 
      System.out.println("Make sure to enter a valid number. Error:" + mistake); 
     } 
    } while (true); 
0

使用keyboard.nextLine()NumberFormatException

do { 
      // more code 
      try { 
       arraySize = Integer.valueOf((keyboard.nextLine())); 
      } catch (NegativeArraySizeException mistake) { 
       // more code 
       isValid = false; 
      } catch (InputMismatchException mistake) { 
       // more code 
       isValid = false; 
      } catch (NumberFormatException mistake) { 
       // more code 
       isValid = false; 
      } 
} while (isValid == false); 
+0

[Scannerクラスのnext()メソッドとnextLine()メソッドの違いは何ですか?](http://stackoverflow.com/questions/22458575/whats-the-difference-between-next-and-nextline-methods-from-スキャナクラス) – Alice

関連する問題