2017-12-08 5 views
1

スキャナを使用しようとするとcatchステートメントがクラッシュする問題があります。私は私のcomp sciクラスのシンプルなロックペーパーハサミプログラムを作っています。私の目標はクラッシュすることを事実上不可能にすることです。私のコードは次のとおりです。スキャナがcatchステートメントをクラッシュする

public class RPS { 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    Random gen = new Random(); 
    int rounds = 0, choice, playerchoice = 0, complete, playerwins, compwins; 
    String cont = "y"; 

    System.out.println("Rock, Paper, Scissors!"); 

    while ("y".equalsIgnoreCase(cont)) { 
     complete = 0; 
     playerwins = 0; 
     compwins = 0; 
     System.out.println("How many rounds would you like to play?" 
       + " (1, best of 3, or best of 5)"); 

     while (true) { 

      try { 
       rounds = scan.nextInt(); 
       while (rounds != 1 && rounds != 3 && rounds != 5) { 
        System.out.println("Invalid number of rounds."); 
        System.out.println("One game, best of 3, or best of 5?"); 
        rounds = scan.nextInt(); 
       } 
       break; 

      } catch (Exception e) { 
       while (rounds != 1 && rounds != 3 && rounds != 5) { 
        System.out.println("Invalid number of rounds."); 
        System.out.println("One game, best of 3, or best of 5?"); 
        rounds = scan.nextInt(); 
       } 
      } 
     } 

netbeansがtryブロック内でInputMismatchExceptionをスローしない限り、コードは完全に正常に進みます。 catchステートメントはこの種の事柄を止めることになっていますが、それでもクラッシュしてしまいます。理由はわかりません。

私は穏やかな高校生なので、私が使用している恐ろしいコーディングの慣例に対してお詫び申し上げます。私の唯一の目標は、これを動作させることです。

+0

質問にスタックトレースを追加する必要があります。キャッチブロックで何が失敗したのかを教えてくれます。 Stacktraceを印刷するには、あなたの前にキャッチブロックに 'e.printStackTrace();'を追加します。 – SWiggels

答えて

1

{この}を試してみてください。「試してみてください。うまくいけば、それをやってください。ここでの問題は、tryブロックと同じコードをcatchブロックに置くことです。私たちは、

  • ユーザ入力によって、私たちは今、catchブロック
  • に行く
  • 有効ではない何かをTryブロックを入力

    1. 、ユーザーはcatchブロックであり、それら:これを想像してみて無効なものを入力してください
    2. 今、失敗しましたが、私たちはどこにも行きませんでした!私たちはすでにキャッチブロックに入っています。
    3. 我々はscan.nextInt()アウト

    に失敗。無効な入力を受け取ったときはいつでも失敗するので、その関数を呼び出すたびにtryブロック内になければなりません。

    このように、これは単にキャッチブロックを空白のままにすることで解決できます(または、「有効なラウンド数を入力してください」と印刷するだけです)。キャッチブロックに失敗すると、何も起こりません。whileループに当たってtryブロックに戻り、別のスタブを返します。

  • +0

    catchブロックからコードを削除する(または単にprintlnコマンドを実行する)と、catchブロック内で無限にスタックされます。 tryブロックに戻り、そのコードを再度実行して有効な数値を入力できる方法はありますか?ご協力いただきありがとうございます! –

    +0

    catchブロックの中にwhileループを含めないように注意してください。そうでないと、catch内でそのループに詰まっている可能性があります。 whileループを既に削除してもまだ失敗している場合は、更新されたコードを表示してください –