2017-02-16 12 views
1

アルゴリズムはArrayListに3つの整数を取ります。入力が整数でない場合は、プロンプトが表示されます。コードを実行するとcatch句が実行されますが、プログラムは無限ループになります。誰かが私を正しい方向に導くことができました、私は助けに感謝します。 :-DJavaのdo-whileループによる例外処理

package chapter_08; 
import java.util.Scanner; 
import java.util.List; 
import java.util.ArrayList; 

public class IntegerList { 
    static List<Integer> numbers = new ArrayList<Integer>(); 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int counter = 1; 
     int inputNum; 

     do { 
      System.out.print("Type " + counter + " integer: "); 
      try { 
       inputNum = input.nextInt(); 
       numbers.add(inputNum); 
       counter += 1; 
      } 
      catch (Exception exc) { 
       System.out.println("invalid number"); 
      } 
     } while (!(numbers.size() == 3)); 
    } 
} 

答えて

3

これは、次のintがnextInt()を使用して読み取られ、失敗した場合、Scannerにはまだ型付きの内容が含まれているためです。その後、do-whileループに再入力すると、input.nextInt()は同じ内容で再度解析しようとします。

あなたがに 'フラッシュ' nextLine()Scanner内容必要があります:あなたはそれを使用していないので、あなたは、counter変数を削除することができ

  • catch (Exception exc) { 
        input.nextLine(); 
        System.out.println("invalid number"); 
    } 
    

    ノート。そうでない場合は、counter += 1counter++に置き換えることができます。

  • while (!(numbers.size() == 3))while (numbers.size() != 3)、またはそれ以上に置き換えることができます。while (numbers.size() < 3)
  • 例外をキャッチするときは、別の理由がない限り、可能な限り具体的にする必要があります。あなたのケースではExceptionInputMismatchExceptionに置き換えてください。
0

あなたがすべきは、そのようなあなたのcatch(){}break;を使用するには:1つの入力は、あなたのループを破る修正されていない

try { 
    inputNum = input.nextInt(); 
    numbers.add(inputNum); 
    counter += 1; 
} catch (Exception e) { 
    System.out.println("invalid number "); 
    break; 
} 

もしそうなら。

1

inputNum = input.nextInt();がintに収まらず、InputMismatchExceptionが発生した場合、Scannerの入力は消費されません。

のでキャッチした後、それがループし、それが再びここに行く:

inputNum = input.nextInt(); 

を入力中にまったく同じ内容で。

catchステートメントでinput.nextLine();を実行すると、現在の入力を破棄してユーザーからの新しい入力を許可する必要があります。
は、それが発生する可能性が不一致とは関係を持つ他の例外としてInputMismatchExceptionではなくExceptionをキャッチするために、より理にかなっているだけでなく、それは問題ではない場合には、ユーザー"invalid number "に表示するのに有用ではない。

catch (InputMismatchException e){ 
     System.out.println("invalid number "); 
     input.nextLine(); 
    } 
0

それは完璧にうまく機能

String inputText=input.next(); 
inputNum = Integer.valueOf(inputText); 

inputNum = input.nextInt(); 

を変更してみてください。

0

スキャナを次の行に移動する必要があります。 catchセクションのエラーメッセージの下にこの行のコードを追加します。

input.nextLine();