読者です 読者をやめる 読者になる 読者になる

It's okay to be weird

レールの無い道を行くプログラマーのブログ

【Java】やっとScannerのhasNextInt()を使った判定方法が理解できた

UdacityのIntroduction to Programmingで、入力された値が整数かどうか判定するのにhasNextInt()を使っているプログラムがある。いまいちhasNextInt()がどういう働きをしているのかよく解ってなかったのだけど、ようやく (おそらくは) 理解できたので書いておく。

import java.util.Scanner;

public class ScannerTest
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        double n;
        
        System.out.print("整数を入力してください:");
        if (in.hasNextInt()) {
            n = in.nextInt();
            System.out.println(n + "を入力しました。");
        } else {
            System.out.println("整数ではありません。");
        }
    }
}

こんなコードを見たときに、「nextInt()で入力待ちになるんだよなあ。hasNextInt()では何をやってるんだろう?ifの判定の前にとりあえずifブロックの中に入ってnextInt()まで行って、入力をもらったあとでifの判定に戻ってくるんだろうか?」などと、今思えばありえないことを考えていた。
実際は、ちょっと試してみれば解るのだけど、hasNextInt()で既に入力待ちになっていて、そこで読み取ったトークンをそのまま次のnextInt()で渡しているというだけだった。
トークンが残っている場合は、それが次のnextInt()で入力を待たずに渡されるということを知らなかったのでこの考え方が出来なかった。nextInt()では必ず入力待ちになると思っていたので。
参照: 指定した型の値を読み込む - Scannerクラス
あとはhasNextInt()では次のトークンに移らないというのもポイントかな。それがあってwhileの条件なんかに使うことができる。

一応ここまでは理解はできたのだけど、Scannerの中身ってどうなってるんだろうとか、nextはあるけどpreviousとかはないから、読み取られたトークンはScannerから破棄されてるんだろうかとか、System.inってそもそもなんなんだろうとか気になりだしたけど、今の段階でそこまで踏み込む必要は無いだろうと思うのでこのへんにしておく。