2016-10-29 20 views
-1

私は6つの数字のユーザー入力を取得し、それらを整数のツリーセットに追加するメソッドを作成しようとしています。私は試しに例外をキャッチしようとしているので、ユーザが誤って手紙を入力した場合、例外を捕捉して番号を入力するように求めます。現在、手紙を入力しようとすると、プログラムがクラッシュします。それは "無効"を印刷し、クラッシュします。私は何が起こっているか分からない。誰かがいくつかの洞察力を提供できますか?例外をキャッチしようとするとプログラムがクラッシュする

public static Set<Integer> getTicket() 
{ 
    int userInput; 
    TreeSet<Integer> getNumbers = new TreeSet<Integer>(); 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter your 6 numbers between 1-40: "); 
    for (int i = 0; i<6 ; i++) 
    { 
     try 
     { 
      System.out.print(i+1 + ": "); 
      userInput = input.nextInt(); 
     } 
     catch (InputMismatchException e) 
     { 
      System.out.println("Invalid"); 
      userInput = input.nextInt(); 
     } 
    getNumbers.add(userInput); 
    } 
    System.out.println("Your ticket was: " + getNumbers); 
    return getNumbers; 
} 
+0

が重複する可能性が役に立てば幸い(http://stackoverflow.com/questions/26375630/hot-to -stop-the-program-from-at-in-of-in-of-in-in-in-of-in-of-in-in-in-in-in-in-in-of-in) – qwerty1423

答えて

-1

これは、キャストブロック内で例外をキャッチしないために発生します。 forループしながら、してみてください、ここでは良い見ていない:

System.out.println("Your ticket was: " + getNumbers);

何ができるか、ストリームを使用することです::

public static Set<Integer> getTicket() 
{ 
    int userInput; 
    TreeSet<Integer> getNumbers = new TreeSet<Integer>(); 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter your 6 numbers between 1-40: "); 
    int correct = 0; 
    while(correct < 6) 
    { 
     try 
     { 
      System.out.print((correct+1) + ": "); 
      userInput = input.nextInt(); 
      getNumbers.add(userInput); 
      correct++; 
     } 
     catch (InputMismatchException e) 
     { 
      System.out.println("Invalid input"); 
     } 
    } 
    System.out.println("Your ticket was: " + getNumbers); 
    return getNumbers; 
} 

はまた、あなたは単純なことをプリントコレクションをcant't

System.out.println("Your ticket was: " + getNumbers.stream().map(Object::toString).collect(Collectors.joining(" ")));

+0

私はあなたのコードを試してみました。文字を入力すると無限の入力も無限に印刷されます。 – OrangePineapple

0

いくつかの変更点についてご説明します。元のコードから、私が気づいたことは、実際にはエラーではなく、頭のスクラッチャーです。どちらの方法(getWinning Numbers()getTicket())でもSet<integer>が返されましたが、メインでは使用しませんでした。だから、私は単にメソッドからの出力を取り出して、メインメソッドに配置しました。ここで、IMHOにする必要があります。このようなメソッドは1つのことを行う必要があり、この場合は整数のセットを返します。印刷もそれ以外のものはありません。

getTicket()メソッドでロジックを変更しました。私は、あなたが6つの有効な番号を持つまで、ループを設定するだけです。そのループの中で私はtryステートメントを使って無効な入力を取り除きます。 tryステートメントが設定されている方法は、これを達成できる多くの方法の1つです。 tryguess = Integer.parseInt(userInput);)の直後のステートメントは、無効な入力問題がポップアップしてNumberFormatExceptionをスローする場所です。入力が無効な場合は、すぐにメッセージを出力し続けるcatchにドロップします。入力が有効であれば、重複と番号の範囲をチェックするだけです。数字がOKの場合は、pickedNumbersに追加し、数字を増やしてください。

public class Lottery 
{ 
    public static Set<Integer> generateWinningNumbers() 
    { 
     Random rndNumbers = new Random(); 
     TreeSet<Integer> winningNumbers = new TreeSet<Integer>(); 
     int max = 40; 
     int min = 1; 
     int range; 
     int sixNum; 

     for (int i = 0; i < 6; i++) 
     { 
     range = max - min + 1; 
     sixNum = rndNumbers.nextInt(range) + min; 

     while (winningNumbers.contains(sixNum)) 
     { 
      sixNum = rndNumbers.nextInt(range) + min; 
     } 
     winningNumbers.add(sixNum); 
     } 
     return winningNumbers; 
    } 


    public static Set<Integer> getTicket(Scanner input) 
    { 
    String userInput; 
    int guess; 
    TreeSet<Integer> pickedNumbers = new TreeSet<Integer>(); 
    System.out.println("Enter your 6 numbers between 1-40: "); 
    int numberCount = 1; 
    while(numberCount < 7) 
    { 
     System.out.print(numberCount + ": "); 
     userInput = input.nextLine(); 
     try 
     { 
      guess = Integer.parseInt(userInput); 
      if(guess > 0 && guess < 41 && (!pickedNumbers.contains(guess))) 
      { 
      pickedNumbers.add(guess); 
      numberCount++; 
      } 
      else 
      { 
      if (pickedNumbers.contains(guess)) 
      { 
       System.out.println("Number already picked: " + guess); 
      } 
      else 
      { 
       System.out.println("Invalid number. Pick a number between 1-40: " + guess); 
      } 
      } 
     } 
     catch (NumberFormatException e) 
     { 
      // bad input 
      System.out.println("Invalid input: " + userInput); 
     } 
    } 
    return pickedNumbers; 
    } 
} 

メインでの変更は、Setの整数を返すメソッドを利用するようになりました。 2つのSet<Integer>変数(winningTicketuserTicket)を作成すると、メソッドから返されたセットを取得し、メソッドの結果を出力するのではなく、結果を出力するだけです。

public static void main(String[] args) throws IOException 
{ 
    Scanner userInput = new Scanner(System.in); 
    boolean done = false; 
    String yesNo; 
    Set<Integer> winningTicket; 
    Set<Integer> userTicket; 
    while(!done) 
    { 
    winningTicket = Lottery.generateWinningNumbers(); 
    userTicket = Lottery.getTicket(userInput); 
    System.out.println("Your ticket was: " + userTicket); 
    System.out.println("Winning Numbers: " + winningTicket); 
    System.out.print("\nWould you like to try again? "); 
    yesNo = userInput.nextLine(); 
    if(!yesNo.equalsIgnoreCase("y")) 
    { 
     System.out.println("Done"); 
     done = true; 
    } 
} 
userInput.close(); 
} 

これは、[文字列をintの代わりに入力された後にクラッシュからプログラムを停止するためにホット]の

+0

これは正しいアイデアです。現在、実際にはこれが唯一の答えと思われます。おめでとうございます。あなたはそれにいくつかの説明を追加することができれば本当に良いでしょう。 OPのコードで何が間違っていたのですか。何を変更しましたか、なぜですか? OPは、実際の説明よりも「コード・ダンプ」から何かを学ぶ可能性は低いです。 –

+0

@DavidWallace ...この投稿は前の投稿から引き継がれています。ポスターにはこの同じコードとは異なる問題がありました。誰かが助けて、無効な入力エラーを指摘しました。彼らはそれを修正する方法を尋ねた、私は何かを試して、それが動作しない場合、新しい質問を投稿して言った。これはどちらですか?私はただ助けようとしていた。ごめんなさい。 – JohnG

+0

謝罪しないでください。私が言ったように、これはここで最高の答えです。私はあなたがそれをより良くする方法を示唆しているだけです。 –

関連する問題