2014-08-31 48 views
2

我是Java新品牌,這是一個投擲我。使用下面的代碼,它會循環處理第一個問題,直到我輸入除整數之外的任何內容,但在完成該循環後,它不會停止解決剩下的問題。「hasNextInt」不檢測後續輸入;在哪裏放「nextLine」?

通過一些研究和閱讀,我發現我需要使用in.nextLine()在輸入後吃掉換行符。但是,無論我在哪裏放置nextLine()都不起作用?我認爲這將是第一個int input = in.nextInt();線,但沒有奏效。任何幫助將在哪裏去,爲什麼?

System.out.print("How many CUs per course are remaining in your degree program? Enter any letter to quit: "); 
while (in.hasNextInt()) { // Verify input is an integer 
    int input = in.nextInt(); 
    if (input <= 0) // Verify that input is not negative or zero 
    { 
     System.out.println("Please enter a positive number or any letter to quit"); 
     System.out.print("Add another course or any letter to quit: "); 
    } else { 
     courseCuList.add(input); 
     System.out.print("Add another course or any letter to quit: "); 
    } 
} 
System.out.print("How many CUs do you plan to take per term?"); 
while (in.hasNextInt()) { 
    int input = in.nextInt(); 
    // in.nextLine(); This line consumes the \n 
    if (input <= 0) { 
     System.out.println("Please enter a whole positive number."); 
     System.out.println("How many CUs do you plan to take per term?"); 
    } else { 
     cuPerTerm = in.nextInt(); 
    } 
} 
+1

我只會使用'nextLine'和'Integer.parseInt'。在輸入不同的輸入之後,這比試圖消耗面向行的流「正確的方式來修復下一個掃描器讀取」要容易得多。 – user2864740 2014-08-31 22:44:25

+0

基本上,每次你編碼nextInt(),你必須跟着nextLine()去消耗換行符(假設你每行輸入一個數字) – Bohemian 2014-08-31 23:02:12

+0

使用nextLine和Integer.parseInt將取代in.hasNextInt ()正確嗎?波希米亞,在這種情況下,nextLine()會跟在第一個int input = in.nextInt()右邊?我已經試過,他們每個人和他們兩人,它仍然通過第二個輸入。我已經閱讀了很多有關這個問題的問題,但似乎沒有一個適用於我的情況。我很欣賞這些快速反應。 – 2014-08-31 23:06:51

回答

0

您需要閱讀兩次。

while循環的退出條件是hasNextInt() - 檢查,看看下一個記號是一個整數實際上並不清楚道理,這意味着未來nextLine()是要讀的令牌,並隨後將nextLine()閱讀換行符。

爲了證明這一點,將循環之間的以下內容:

System.out.println(in.nextLine() + " | " + in.nextLine()); 

對於輸入4, 4, A,你會看到輸出:

How many CUs per course are remaining in your degree program? Enter any letter to quit: 4 
Add another course or any letter to quit: 4 
Add another course or any letter to quit: A 
| A 
How many CUs do you plan to take per term? 

2個需要被標記從緩衝區清除,並且它們都不是整數。因此,無論你把nextLine()放在哪裏,都會失敗 - 你需要插入兩次。如果只插入一次,則下一個標記將不是整數,並且hasNextInt()將在程序嘗試進​​入第二個循環時失敗。

爲了讓你的程序工作,只需插入:

in.nextLine(); in.nextLine(); 

第二循環之前。 (請注意,你不應該把兩者這和打印出來的,因爲這將讀取次)。

1

你的問題是,在while (in.hasNextInt())hasNextInt需要每個呼叫等待用戶輸入,然後測試它是否是整數。

因此,每次用戶給出整數,條件將被評估爲ture,循環將執行,條件將需要再次檢查,如果它是整數循環將再次執行。這將一次又一次,直到hasNextInt將能夠返回false,例如當用戶會給非整數像字母。但在這種情況下,下一個循環中的條件也將返回false,因爲此非整數值在第一次循環後未被消耗。爲了讓第二個循環的工作,你就需要調用nextLine兩次

  1. 消耗行分隔符之前放後正確的整數
  2. 消耗實際的非整數值

但是,這也可能會失敗,如果用戶不會在非整數值之前放置任何整數,因爲不會有行分隔符消耗。

所以考慮改變你的邏輯類似的東西

boolean iterateAgain = true; 
System.out.print("give me positive number: "); 
while (iterateAgain) { 
    // this inner loop will move on only after getting integer 
    while (!in.hasNextInt()) {//here program waits for user input 
     in.nextLine();// consume non-integer values 
     System.out.print("that wasn't positive number, try again: "); 
    } 
    int number = in.nextInt();// now there must be number here 
    in.nextLine();// consume line separator 
    if (number > 0) { 
     System.out.println("you gave " + number); 
     // do what you want with this number 
     iterateAgain = false;// we can leave loop 
    } else 
     System.out.print("that wasn't positive number, try again: "); 
} 

如果要執行下一個循環,那麼所有你需要的是復位iterateAgain價值true

+0

如果可以的話,我會將兩者都標記爲答案。謝謝你們不僅僅是爲了一個有效的答案,而是爲了解釋。現在我知道如何解決這個問題,爲什麼它不能以我試過的方式工作。 – 2014-09-01 00:00:23

+0

@DouglasGreer沒問題。我很高興我可以幫助:) – Pshemo 2014-09-01 00:01:44