1

谁能指出我正确的方向,为什么当我使用 for 循环时 println 函数在输出中出现两次。谢谢

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    System.out.println("Enter the number of employees to calculate:");
    int numberEmployees = scan.nextInt();

    for(int i=0; i<numberEmployees; i++){               
            System.out.println("Enter First Name:");
            name = scan.nextLine();
            System.out.println("Enter Last Name:");
            last = scan.nextLine();
            System.out.println("Enter Document #:");
            document = scan.nextInt();
            System.out.println("Enter Basic Salary");
            basicSalary = scan.nextInt();
            System.out.println("Enter # of Hours");
            hours = scan.nextInt();
    }
}

输出

Enter the number of employees to calculate:
1
Enter First Name:
Enter Last Name:
daniel
Enter Document #:
4

2 回答 2

3

问题是,当您输入1新行时,该nextInt()函数不会删除您在 1. 中输入的换行符。将您的调用更改scan.nextInt()Integer.parseInt(scan.nextLine()),它应该按照您想要的方式运行。

进一步解释;这是来自 Java API 的东西。

Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。

next() 和 hasNext() 方法及其原始类型的伴随方法(例如 nextInt() 和 hasNextInt())首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。hasNext 和 next 方法都可能阻塞等待进一步的输入。

所以,显然发生的事情(我没有在页面上看到任何确认)是在next(),hasNext()和它们的相关方法读入一个令牌之后,他们立即返回它,而不会在它之后吞噬分隔符(在我们的例子中是空格) . 因此,在它读入你的 1 之后,换行符仍然存在,所以下面的调用nextLine()有一个换行符来吞噬并这样做。

于 2012-07-31T22:42:50.197 回答
0

第一次输入后,换行符似乎仍保留在您的输入中。当请求下一个输入时,扫描器会看到一个换行符并将其解释为输入的结尾。这使它看起来跳过了所有其他输入请求。我建议查看 Java API 文档以了解Scanner' 方法的确切行为。

于 2012-07-31T22:42:09.633 回答