これは、コンソールベースの小さなクイズゲームの基本設定です。答えは番号が付けられています。私はプレーヤーに答え番号を与えたい。入力が数字でない場合、私のプログラムは警告を出し、適切な入力を待つべきです。 代わりに、(数字でないものを挿入した後に)取得するものは、質問をして回答を再度提示する無限ループです。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();
}
}
}
私はここで間違っていますか?
実は、hasNext'はSystem.in' ''と連携しているのですか?私は 'Scanner'をクローズする条件ブロックに入っているとは思っていません。これは' Scanner'でクローズされた 'InputStream'(' System.in')を閉じた 'Scanner'を再作成しようとし、例外は信じます。 – AxelH
presentQuestion()とpresentAnswers()がループ内にある理由は、(後の段階で)さまざまな質問をしたいからです。同じメソッドを呼び出すと、異なる質問が表示されます。したがって、quizActiveがもはや真(これは問題の終わりではなく、クイズ全体の終わりに無効になる)になるまで、再び呼び出す必要があります。 – KeizerHarm
@AxelHはい。私はそれをデバッグした。最初に 'hasNext'をブロックしますが、scanerが閉じられた後、その基底のストリームも閉じられます。その後、 'hasNext'はブロックせずに' false'を返します。 – talex