2016-06-25 4 views
1

hasNextInt()APIを読み終えても、このコードではまだ失われています。スキャナhasNextInt()hasNextInt()に何もない場合はtrueを返します

Scanner input = new Scanner(System.in); 
while (input.hasNextInt()) { 
    input.next(); 
} 

なぜ入力に何もないのにループが開始します。また、hasNextInt()APIには、

が入力されていません。

これは何を意味しますか?そしてそれはそれと関係がありますか?

答えて

1

同様に、Scanner input = new Scanner(System.in);はブロッキングコールではなく、STDINを入力として新しいスキャナを作成するだけです。したがって、実行はwhileループに進みます。このスキャナは、その入力に別のトークンを持っている場合https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNext()

のAPIドキュメントから

はtrueを返します。このメソッドは、入力をスキャンするのを待つ間にブロックされることがあります。スキャナは入力を超えて進まない。

ユーザが何かを入力してEnterキーを押すと、スキャナが待機します(この時点ではinput.hasNextInt()が実際にブロックコールしています)。

その後、input.next();に、それは実際にhasNextInt入力を読んで(それを消費)と進める読み取り位置を

+0

そのAPIのみ(のhasNextには適用されません)とありませんか()?また、通話をブロックするための良い記事がありますか?私が読んでいる本は、通話をブロックすることについて何も言及していません。 – Davidh3

+0

hasNext *()を持つ関数。私。 hasNextLong()、hasNextByte()、hasNextShort()はwhileループ内で最初の呼び出しを行うと呼び出しをブロックします。ここで、端末に入力として「12 hello」と入力すると、ループが一回ループしてからループするまでに時間がかかることがあります。理由はhasNext *()が最初の空白まで読み込まれ、そのintが2番目のループで文字列に遭遇するかどうかをチェックするため、hasNextInt()はfalseを返し、ループを破ります。私は通話をブロックするための専用の本はないと思いますが、ほとんどのIO関連の呼び出しは、Java NIOライブラリを持っていなければ通話をブロックしています – printfmyname

関連する問題