2012-07-31 81 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方法的確切行爲。