2017-10-27 10 views
-1

私のプログラムでは、ユーザーから入力する必要がありますが、整数でなければなりません。ユーザーが整数を入力しない場合は、整数を入力するように再指示するプログラムが必要です。完璧に動作ループコードスニペットのオンラインながら、私は例を見つけましたが、私はなぜ、どのようにそれが動作の問題は理解した、と私は本当に良く理解したいと思います:この例でJava Scannerオブジェクトがどのように機能しているかわかりません(hasNextInt、next ...?)

Scanner reader = new Scanner(System.in);  
int guess=0;    
System.out.println("Guess the number"); 

while (!reader.hasNextInt()) {  //I get that this is a "not have" boolean 
    System.out.println("That's not a number. Please enter a valid number"); 
    reader.next(); 
} 

guess= reader.nextInt(); 
System.out.println(guess); 

私の質問は以下のとおりです。

  1. whileループの!hasNext条件は、実際にユーザーに入力を要求し、その入力を確認するためにスキャナオブジェクトをトリガしますか、または既に入力されたものだけをチェックしますか?
  2. なぜreader.next()が必要ですか。 whileループのメインステートメントの後の行と、これは正確に何ですか?私はそれを取るときにプログラムが機能しないので、それが必要であることを知っています。しかし、それは入力を促していますか?はいの場合、この入力はどうなりますか?
  3. guess = reader.nextInt();実行すると、なぜユーザーはこの時点で入力を促しますか?

申し訳ありませんが、これらはおそらく基本的な質問ですが、私はコーディングとJavaの新機能で、この特定の例では内部的に何が起こっているのかについて頭を浮かべることはできません。スキャナ。

+0

google [java Scanner hasNextInt()](https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextInt)よりも、stackoverflowで質問を書くのに時間がかかります。 ()と[java!operator](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html) – devpuh

+0

独自の調査や独自のテストを防止するためのさらに別の「私は新しい」弁解があります。 _easily_なぜあなたが 'next()'を削除して何が起こったのかをテストするときになぜそれが必要なのかを知ることができます。 – Tom

+0

申し訳ありませんが、私は実際に自分自身でこれを動作させるのに長い時間を費やしており、これまでの多くの質問を見てきました。これは正直に最後の手段でした。私が言ったように、私はそれを実験して取り除き、それが機能しなかったので、next()が必要であることを知っていました。私はそれが必要な理由を理解していませんでした。 –

答えて

1

それは確かに、特に直感的ではありませんので、すぐにそれを得ていないために気を悪くしないでください。

何かがスキャナにすでにある場合によっては、あなたが理解した上で抱えている問題は、このようなnextIntとしてその方法がよく、またはユーザー入力のためのプロンプトはないかもしれないということであるように私には思えます。


は、ここで一連のイベントです:あなたは!reader.hasNextInt()を打つまで

あなたのすべてのコードが実行されます。入力がないので、ユーザーからの入力があるまで「ブロック」(待機)します。

ユーザーが 'A'を入力した場合、これは整数ではないため、whileループの本体を入力します。次に、エラーメッセージを出力します。

hasNextIntここで、hasNextIntは、整数であるかどうかをチェックしているときにユーザー入力を「消費」しないため、スキャナに「A」という無効なユーザー入力があります。 reader.next()と呼び、その値を効果的に破棄します。

今度は!reader.hasNextInt()に戻ります。もう一度スキャナーが空になるので、ユーザーの入力を促します。彼らが別の非整数を入力すると、そのプロセスは単に繰り返されます。

今度は、有効なユーザー入力があります。数字2を入力しました。これにより、whileループが終了し、私たちは続けます。

私たちはスキャナにいくつかの情報を入力しましたが、それを消費していません。 whileループの条件のために整数であると確信しています。今では入力をreader.nextInt()で消費し、それを変数に代入できます。

+0

ありがとう、本当に役に立ちます。私も混乱していたと思うのは、スキャナが!hasNextIntビットで非整数の入力を "取る"/"保存"するということですが、あなたの答えは本当に私のためにその混乱を明らかにするのに役立ちます。私も愚かに感じないようにしてくれてありがとう。 –

+0

問題ありません、喜んで助けてください。あなたが有益であると答えたものをupvoteし、最良のものを受け入れることを忘れないでください。 – Michael

+0

私のupvotesは記録されますが、私はあまりにも新しいユーザーであるため表示されません、私は同じ答えを受け入れるために行くと思う。 –

1
  1. hasNextInt()は、次の入力が整数かどうかを確認するだけです。入力をまったく消費しません。 !は、この機能のtheuの結果を否定しています。 hasNextInt()として

  2. 我々はhasNextInt()は、ユーザーの次の入力値をチェックするようにするユーザー入力をconsumeoするnext()を使用する必要があり、その後、消費しません。あなたはそれを一切必要としないので、それを任意の変数に割り当てる必要はありません。

  3. Scannerプロンプトがまったく表示されません。プロンプトはSystem.out.println()で印刷されます。

    行番号nextInt()の場合は、次のユーザー入力を消費するために使用されます。この行を実行するときにはhasNextInt()が真でなければならないので、消費を待っている整数入力が1つ存在しなければならないので、このメソッドはそのユーザー入力ですぐに戻ることができます。

+0

なぜdownvote?私には正しいと思われる。 – Michael

+0

'!' -Operatorがありません。 – devpuh

+0

ありがとうございます。 printステートメントは入力を求めるメッセージを表示するものですが、実際にユーザーが実際に何かを入力させるようにするのは本当ですか?私はそれがスキャナのラインの1つを介して起こっている必要があると思ったが、問題は、while条件でhasNextInt()で何かを入力させると、別の入力を求めていない推測= reader.nextInt();それはループを終了します。 ここでスキャナを理解するために何かが欠けていると思います! –

-2
Try it :) 
public static void main(String[] args) { 
     int option; 
     if(args!=null&&args.length>0){ 
     option = Integer.parseInt(args[0]); 
     } 
     else{ 
     System.out.println("Enter:\n 1 to run x \n 2 to run y \n"); 
     Scanner keyboard = new Scanner(System.in); 
     option = keyboard.nextInt(); 
     } 
     switch (option) { 
      case 1: 
       xx 
       break; 
      case 2: 
       yy 
       break; 
      default: 
       break; 
     } 
    } 
+0

あなたは質問を読んでいますか?あなたはそれを理解しようとしましたか? 「この例でJava Scannerオブジェクトがどのように動作しているか理解していない」とは、「私の例とは関係のない、他のコードのコードを嗅ぎたえてください」という意味ですか? – Tom

+0

のみ、このコードは基本的であり、あなたはスキャナintを知るためにデバッグすることができます:) –

+0

この提案されたコードはそれほど有用であることはできません。デバッギングの助けとなる3つの質問がOPのどれにも含まれていません。 'while(!reader.hasNextInt())'ループや、そのコードに 'reader.next()'が存在する理由を理解するのに役立つものではありません。 – Tom

関連する問題