2017-12-01 5 views
0

これは初めてのことです。私はコーディング方法を学び始めているので、私は正直なところ、この質問が私がここで見つけられるものではないことを願っています! (私はしばらく検索していると約束しますが、私はこの話題のノブなので疑問を解決するために私は理解できないものは見つかりませんでした)。JAVAわからないtry-catch

私は、プログラムが乱数を生成し、生成された数を推測しなければならない単純なゲームをJAVAでやっています。 プレーヤーが数字を入力すると、ゲームはランダムに生成された数字よりも高いか低いかを示すヒントを表示します。

数字だけを入力するとプログラム自体はうまく動作しますが、不正なユーザー入力を処理するtry-catchステートメントを追加します。

私は自分のコードに示すように文を使ってみましたが、なぜ違うのか理解できません。数字の異なるものを入力すると例外がキャッチされ、システムコンソールに表示されます。 out.println()が発生するとプログラムは終了します。

私は例外がキャッチされるたびにプログラムを終了させずに数字を入力することを除いて、try-catchを試してみたいと思います。 これを修正するにはどうすればよいですか?

ありがとうございました!

import java.util.Scanner; 

public class HiLo { 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); //Creates Scanner object to read from keyboard 
     String playAgain = ""; //if == y, game restarts 
     try { 
      do { 
       // Create a random number for the user to guess 
       int theNumber = (int)(Math.random() * 100 + 1); 
       //System.out.println(theNumber);  //Uncoment this in case we want to know the number (for testing). 
       int guess = 0; //Number entered by the player 
       int count = 0; //Number of tries of guessing the number 
       while(guess != theNumber){ 
        System.out.println("Guess a number between 1 and 100:"); 
        guess = scan.nextInt(); //Reads the number typed on the keyboard by the player 
        count++; //Plus 1 every time a number is entered 
        System.out.println("You entered " + guess +"."); 
        if(guess < theNumber) { //If number entered is smaller 
         System.out.println("The number is bigger" + ", try again!"); 
         System.out.println("Number of tries: " + count); 
        } else if(guess > theNumber) { //If number entered is bigger 
         System.out.println("The number is smaller" + ", try again!"); 
         System.out.println("Number of tries: " + count); 
        } else { //If both previous cases are false 
         System.out.println("Congratulations! You've found the number!"); 
        } 
       } 
       //Once guess == theNumber 
       System.out.println("Number of tries: " + count); 
       System.out.println("Play again? (y/n)"); 
       playAgain = scan.next(); //Reads the String entered from keyboard by the player 
      } 
      while(playAgain.equalsIgnoreCase("y"));  //If player enters y, start again. 
      //Otherwise 
      System.out.println("Thank you for playing! Goodbye :)"); 
     } catch (Exception e) { 
      System.out.println("Incorrect entering! Please enter a number between 1 and 100."); 
     } 
     scan.close(); //Close scanner 
    } //Close main 
} //Close class 
+1

プログラムが原因であなたがスキャナを閉じているcatch'あなた 'から戻った後に終了しますメイン、だからあなたは何を期待しましたか? – tkausl

+0

これをどうやって解決できますか? do-whileステートメントの構造を変更すると、eclipseでエラーがポップアップし、コンパイルできなくなります。 "System.out.println()"の後に "guess = scan.nextInt()"を追加することを考えましたが、動作しません。 – Vicentequesada

答えて

1

場所whileループ内でキャッチを試みると、catchブロック内のスキャナオブジェクト(スキャン=新しいスキャナ(System.in)を再インスタンス。

while (guess != theNumber) { 
        try {      
         System.out.println("Guess a number between 1 and 100:"); 
         guess = scan.nextInt(); // Reads the number typed on the 
         // keyboard by the player 
         count++; // Plus 1 every time a number is entered 
         System.out.println("You entered " + guess + "."); 
         if (guess < theNumber) { // If number entered is smaller 
          System.out.println("The number is bigger" + ", try again!"); 
          System.out.println("Number of tries: " + count); 
         } else if (guess > theNumber) { // If number entered is 
          // bigger 
          System.out.println("The number is smaller" + ", try again!"); 
          System.out.println("Number of tries: " + count); 
         } else { // If both previous cases are false 
          System.out.println("Congratulations! You've found the number!"); 
         } 
        } catch (Exception e) { 
         System.out.println("Incorrect entering! Please enter a number between 1 and 100."); 
         scan = new Scanner(System.in); 
        } 
       } 
+0

素晴らしい!チャームのような作品!どうもありがとうございます! 私はまだ1つの質問があります。なぜ、別のスキャナオブジェクトを作成する必要があるのですか?私は理解していない、私はそれを私に説明することができますので、私は学ぶことができますか? お時間をありがとうございます! – Vicentequesada

+0

コメントがもう1つありましたが、私はそれを完全に動作させるためにスキャナオブジェクトをもう1つ必要としましたが、なぜhahahaなのか分かりません。あなたはそれが素晴らしいだろうと説明することができれば! :Dありがとう! – Vicentequesada

+0

scan.nextInt()が最初に実行され、次に、推測変数に入力値が割り当てられます。非int型入力は、scan.nextInt()に例外をスローさせます。 scan.nextInt()をループしている間は、非int型の入力を保持しているため例外がスローされ続けます。これは無限ループを引き起こします。これを解決するには、スキャナオブジェクトが非int型の入力値を保持していないことを確認する必要があります。これを行う1つの方法は、catchブロックに新しいScannerオブジェクトを作成することです。 – Barr3l3y3

-1

あなたがの働きを理解する必要がありますtry-catchブロックを使用する必要があります。try内でコード全体を囲む必要はありません。例外の原因となるコード部分を入れてください。その場合は、guess = scan.nextInt();を囲み、例外をキャッチしてください。入力が整数でない場合は、例外が発生します。このようにして、ユーザー入力がの各反復で有効であることを確認できますループ。

Edit_1: は、私はあなたのコードからtry-catchブロックを取り出して、それは私のために正常に動作し、次の&を追加しました:

try{ 
    guess = scan.nextInt();} //Reads the number typed on the keyboard by the player 
catch (InputMismatchException e){ 
    System.out.println("Incorrect entering! Please enter a number between 1 and 100."); 
    scan.nextLine(); 
    continue; 
} 
+0

ええ、それは解決策だと思っていましたが、試してみましたが、単語を入力するとwhile条件が常に偽であるためプログラムが終了しました:/ – Vicentequesada

+0

'scan.nextLine()'をこれを使用できる 'catch'ブロックです。私は自分の答えを編集して、私が意味することを示しています。 –

+0

なぜcontinue文を使用しますか? – Vicentequesada

関連する問題