2017-07-10 32 views
0

これは、コンソールベースの小さなクイズゲームの基本設定です。答えは番号が付けられています。私はプレーヤーに答え番号を与えたい。入力が数字でない場合、私のプログラムは警告を出し、適切な入力を待つべきです。 代わりに、(数字でないものを挿入した後に)取得するものは、質問をして回答を再度提示する無限ループです。Java:不正な入力を拒否し、スキャナを使用して適切な入力を待つ方法

public static void main(String[] args) { 

    boolean quizActive = true; 
    while(quizActive) { 

     presentQuestion(); 
     presentAnswers(); 

     Scanner s = new Scanner(System.in); 

     if (s.hasNext()) { 
      String choice = s.next(); 

      if (!NumberUtils.isNumber(choice)) { 
       presentText("Please insert the answer number."); 
      } else { 
       System.out.println("You made a choice!"); 
       checkAnswer(choice); 
       quizActive = false; 
      } 
      s.close(); 
     } 
    } 
} 

私はここで間違っていますか?

答えて

2

質問と回答が表示されたくない場合は、presentQuestion()presentAnswers()をループ外に移動してください。

しかし主な問題は、Scannerを閉じることです。

s.close();を削除し、Scanner s = new Scanner(System.in);をループ外に移動します。

+0

実は、hasNext'はSystem.in' ''と連携しているのですか?私は 'Scanner'をクローズする条件ブロックに入っているとは思っていません。これは' Scanner'でクローズされた 'InputStream'(' System.in')を閉じた 'Scanner'を再作成しようとし、例外は信じます。 – AxelH

+0

presentQuestion()とpresentAnswers()がループ内にある理由は、(後の段階で)さまざまな質問をしたいからです。同じメソッドを呼び出すと、異なる質問が表示されます。したがって、quizActiveがもはや真(これは問題の終わりではなく、クイズ全体の終わりに無効になる)になるまで、再び呼び出す必要があります。 – KeizerHarm

+0

@AxelHはい。私はそれをデバッグした。最初に 'hasNext'をブロックしますが、scanerが閉じられた後、その基底のストリームも閉じられます。その後、 'hasNext'はブロックせずに' false'を返します。 – talex

1

私は本当にユーザー入力を取得するためにスキャナを使用する点を得ていません。

スキャナクラスは、CSVのような既知の構造のフラットファイルから構造化入力を処理するのに最適です。

しかし、ユーザーの入力はすべての人間の不完全さに対処する必要があります。あなたが得るすべての唯一の利点は、

はなぜ他の人によって提案されたループで脇 InputStreamReaderを使用していない... scanne.nextInt()が失敗したクリアされていない入力に対処するためのコストで自分自身を Integer.parseInt()あなたを呼び出すために必要とされていません後は?

+0

正直言って私は人生を楽にするためにScannerを使用していますので、コンソールの前に置いておきたいUIの種類(数字とコマンドの両方を受け付けるもの)理想的には)。 – KeizerHarm

+0

@KeizerHarm *「私の人生を楽にするためにここにスキャナを使用しています」*もっと簡単だったら、なぜこの質問をしなければならないのですか? ; o) –

+0

実際のUI(これは私がほとんど経験していないものです)を作成するとデバッグがさらに進んでしまうので、使い方が分かっているかもしれません。 – KeizerHarm

0

quizActiveブールで規制されているループ・ウィッチでクイズを開始しました。つまり、ループが再び始まるたびに、presentQuestion()presentAnswers()のメソッドが呼び出されます。

例えば数字以外の文字を入力しないと、プログラムはpresentText("Please insert the answer number.")を実行し、ループを再開します。ループを再開すると、メソッドpresentQuestion()presentAnswers()が呼び出されます。

これを停止するには、入力シーケンスの周りに別のループを作成できます。 Scanner s = new Scanner(System.in)もループの外側にある必要があります。そして、最初の入力の直後にスキャナーを閉じてからもう一度開いてはいけません!

あなたがcodeexampleをしたい場合は、私に教えてください:)

0

をここで例:

public class Application { 
    public static void main(String [] args) { 

    System.out.println("Please insert the answer number. "); 

     while (true) { 
      try { 
       Scanner in = new Scanner(System.in); 
       int choice = in.nextInt(); 
       System.out.println("You made a choice!"); 
       checkAnswer(choice); 


       break; 
      } catch (Exception e) { 
       System.out.println("Invalid Number, Please insert the answer number "); 
      } 


     } 
    } 
} 
関連する問題