2017-12-17 19 views
0

私は、整数をチェックし、ユーザが17以上の整数を正しく入力するまでループを維持する関数を作成しようとしています。しかし、「K」や「&」のような誤った入力をすると、無限ループに陥るでしょう。正しい入力を得るためにtryとcatchでループを維持するには?

public static int getAge(Scanner scanner) { 
    int age; 
    boolean repeat = true; 

    while (repeat) { 
     try 
     { 
      System.out.println("Enter the soldier's age: "); 
      age = scanner.nextInt(); 
      repeat = false; 
     } 
     catch(InputMismatchException exception) 
     { 
      System.out.println("ERROR: You must enter an age of 17 or higher"); 
      repeat = true; 
     } 
    } 
    return age; 
} 
+1

[正しくなく、ユーザが応答するまで、whileループでみてくださいキャッチを使用しようとする可能性のある重複無効なデータを入力する(Java)](https://stackoverflow.com/questions/27208796/trying-to-use-try-catch-in-a-while-loop-until-the-user-answers-correctly-without) – vinS

+0

あなたのソリューションの問題は何ですか?それは機能しません。質問をするのを忘れました。 –

答えて

0

私はそれを構成再しようとあなたの方法にスキャナーを通過しており、このようなあなたのメイン内の変数への割り当て方法はないでしょう:

私も思い出して、私のキャッチに再帰を使用しています例外がキャッチされた方法と、idはまた、それがキャッチ作り、多分一般的な例外を使用することをお勧め(例外例外)

main method call of method 
 
    --------------------------- 
 
     int something= getAge(); 
 
     ---------------------------------------------------------- 
 

 
     method structure like this, 
 
    --------------------------------------------- 
 

 
     public static int getAge() { 
 
      int age; 
 
    age = scanner.nextInt(); 
 
      boolean repeat = true; 
 

 
      while (repeat) { 
 
       try 
 
       { 
 
        System.out.println("Enter the soldier's age: "); 
 
        
 
        
 
     if(age<=17){ 
 
        repeat = false; 
 
     } 
 

 
    if(age>17){ 
 

 

 
    getAge(); 
 
    } 
 
       } 
 
       catch(InputMismatchException exception) 
 
       { 
 
        System.out.println("ERROR: You must enter an age of 17 or higher"); 
 
        getAge(); 
 
       } 
 

 
      } 
 
      return age; 
 
     }

<!-- end snippet --> 
+0

意見やコメントはありますか?また、Javaの初心者、私のソリューションについてどう思いますか? –

2

次の利用可能な入力トークンが整数でない場合、nextInt()葉そのScanner内部緩衝入力未。考え方は、他のScannerメソッド(例えば、nextDouble())で読み取ろうと思うかもしれないということです。残念ながら、これは、バッファされたゴミを取り除くために何かをしない限り、nextInt()への次の呼び出しは、同じジャンクをもう一度読み込もうと試みる(そして失敗する)ことを意味します。

したがって、またはnextLine()のいずれかをコールしてからnextInt()に再度電話する必要があります。これは、あなたがnextInt()を呼び出す次回は、それは代わりに同じ古いゴミの上で動作するように新しいデータを持っていることを保証します。

try { 
    //... 
} 
catch(InputMismatchException exception) 
{ 
    System.out.println("ERROR: You must enter an age of 17 or higher"); 
    scanner.next(); // or scanner.nextLine() 
    repeat = true; 
} 
+0

これは受け入れられる回答である必要があります。 –

+0

ありがとう!私はまだスキャナの仕組みに慣れています。 –

関連する問題