2012-07-31 32 views
1

有人会指出我正确的方向,为什么当我使用for循环println函数在输出中出现两次。由于System.out.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 #: 
+0

这已被问了很多次。另请参见:http://stackoverflow.com/questions/7056749/scanner-issue-when-using-nextline-after-nextint – 2012-07-31 22:46:37

回答

3

的问题是,当你有一个新的行中输入1,该nextInt()功能不会删除你从1更改您的来电进入到scan.nextInt()不得不Integer.parseInt(scan.nextLine())换行符,它应该表现你所希望的方式。

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

扫描仪使用定界符模式 将其输入分割为标记,默认情况下该定界符与空白匹配。将得到的令牌然后可以 转换成使用各种未来 方法的不同类型的值。

的next()和hasNext()方法及其基本类型companion 方法(如nextInt()和hasNextInt())首先跳过 定界符匹配的任何输入模式,然后尝试返回下一个 令牌。有下一个和下一个方法可能会阻止进一步的输入 输入。

那么,究竟发生了明显(我没有看到任何页面上进行确认),是在后一个令牌读取next()hasNext(),及其相关的方法,他们立即返回它没有吞噬分隔符(在我们的情况下,空格)之后。因此,在它读入你的1之后,换行符仍然存在,因此以下呼叫nextLine()有一个换行符,并且这样做。

+0

或者,您可以将额外的调用添加到'scan.nextLine()'或查找更优雅的方式来忽略换行符。 – 2012-07-31 22:45:05

+0

就我个人而言,我尝试不使用nextInt()这样的东西来交错nextLine(),因为那样我不得不担心扫描器将在哪里读取它的下一个标记。由于我们预计每行只有一件事,因此一次读取/解析一个完整行更容易。 – 2012-07-31 22:48:06

+0

好点。我只是想给一些替代品。我没有看过这个API,但是你会认为开发者/设计者会添加一个方便的方法来清除多余的字符,特别是空白字符。 – 2012-07-31 22:50:48

0

看来,换行字符的第一个条目后,留在你的输入。当请求下一个输入时,扫描仪会看到换行符,并将其解释为输入的结尾。这使得它似乎跳过每一个其他输入请求。我建议查看Java API文档,了解Scanner方法的确切行为。