hasNextInt()和nextInt()方法流程

时间:2016-01-02 19:59:37

标签: java java.util.scanner

这个条件语句(来自Udacity&#9简介到Java编程|问题集4 |问题#20)是如何工作的?

import java.util.Scanner;

public class MonthPrinter {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Enter a month number (1 through 12) ");

        if (!in.hasNextInt()) {
            System.out.println("Not an integer. Terminating");
        } else {
            int theMonthNumber = in.nextInt();

            if (!(theMonthNumber >= 1 && theMonthNumber <= 12)) {
                System.out.println("Number must be 1 through 12");
            } else {
                Month test = new Month(theMonthNumber);
                System.out.print(test.getMonthName() + " " + test.getNumberOfDays());
            }
        }
    }
}

第一个if (!in.hasNextInt())检查用户输入是否为整数。如果它不是整数,则main方法打印Not an integer. Terminating。这完全合情合理。

但是,如果用户输入一个整数,代码将进入else语句,其中下一行代码为int theMonthNumber = in.nextInt();

当程序运行并且我提供一个整数作为输入时,我没有提示输入另一个输入。我认为hasNextInt()方法和nextInt()方法都应该请求用户输入。因此,我应该被提示总共两个输入(假设我提供一个整数)。当我干这个场景时,我输入一个整数3.这通过了if(!hasNextInt())检查。

在声明的逻辑流程中我缺少什么?

2 个答案:

答案 0 :(得分:2)

  

我在想,hasNextInt()方法和nextInt()方法都应该请求用户输入。

否。 Scanner.hasNextInt() Javadoc说(部分)

  

如果使用nextInt()方法将此扫描器输入中的下一个标记解释为默认基数中的int值,则返回true。扫描仪不会超过任何输入。

最后一句话告诉你消费int

答案 1 :(得分:0)

函数to仅用于检查输入值。它不会消耗输入。会发生什么,它将推进扫描仪并检查数据,但之后它将返回到它之前的位置。从技术上讲,扫描仪的位置没有改变。这就是为什么它没有提示下一次输入。

只有hasNextInt()才会使用这些数据。调用此功能后,扫描仪将前进到下一个位置。