2012-05-07 48 views
9

我是java編程的初學者,遇到了一個奇怪的問題。以下是我的代碼,它會要求用戶輸入並打印出用戶每次輸入一個單詞的內容。如何在java中使用掃描器方法「hasNext」作爲條件退出while循環?

問題是程序永遠不會結束,而且從我的有限理解來看,它似乎卡在while循環中。任何人都可以幫我一下嗎?提前致謝。

import java.util.Scanner; 

public class Test{ 
    public static void main(String args[]){ 
     System.out.print("Enter your sentence: "); 
     Scanner sc = new Scanner (System.in); 

     while (sc.hasNext() == true) { 
     String s1 = sc.next(); 
     System.out.println(s1); 
     } 

     System.out.println("The loop has been ended"); // This somehow never get printed. 
    } 
} 
+7

(offtopic)這是習慣上只寫'而(sc.hasNext())',而'while(sc.hasNext()== true)'。 'hasNext()'已經返回一個布爾值。 –

回答

14

您不斷獲取新的新字符串,如果它不爲空,則繼續循環。只需在循環中爲出口字符串插入一個控件即可。

while(sc.hasNext() && !s1.equals("exit")) { 
    // operate 
} 

如果你想聲明的字符串內循環,而不是做業務的循環體,如果該字符串是「退出」:

while(sc.hasNext()) { 
    String s1 = sc.next(); 
    if(s1.equals("exit")) { 
     break; 
    } 
    //operate 
} 
+0

這很好,但只有當你在循環外部聲明瞭字符串(這可能不是很理想),並且如果你想要執行循環體,即使你得到字符串「退出」,因爲你只是檢查這個條件後身體的執行,這幾乎總是不是你想要的。 – Renato

+0

根據評論編輯。 –

5

Scanner將繼續閱讀直到它找到一個條件「的文件結束」。

正如你從stdin讀書,那會要麼是當你,如果你使用<風格重定向發送一個EOF字符(通常在Unix ^d),或在文件的結尾。

0

你的條件是正確的(雖然你應該放棄== true)。正在發生的事情是,掃描儀將繼續前進,直到它到達輸入端。嘗試Ctrl + D,或從文件管道輸入(java myclass < input.txt)。

3

當您使用掃描儀時,正如Alnitak所提到的那樣,當您有EOF字符時,您只會爲hasNext()獲得'false',基本上...您無法使用鍵盤輕鬆發送和EOF字符,這一點,這是常見的有特殊字符或單詞,你可以發送停止執行,例如:

String s1 = sc.next(); 
if (s1.equals("exit")) { 
    break; 
} 

突破將讓你跳出循環。

+0

「使用鍵盤無法輕鬆發送EOF字符」 - 通常在Linux/Unix/Mac上使用Ctrl + D或在Windows上使用Ctrl + Z進行操作。 – trutheality

+2

謝謝,但操作系統特定的知識通常不能與Java混合...因此評論。 – Renato

1

它不起作用,因爲您沒有編寫故障安全代碼。 java認爲掃描器仍然可以在收集輸入的同時收集輸入,並且如果可能的話,儘管這是真的,但它仍然如此。通過掃描儀測試,看看某個單詞(如EXIT)是否正常,但您也可以將其循環若干次,如十次左右。但最有效的方法是向程序的用戶詢問他們希望輸入的字符串數量,並且在輸入的字符串數量少於他們輸入的字符串數量時,程序將執行。如果他們輸入EXIT,當他們看到他們需要的空間比他們放入的空間少,並且不希望只用空白填充下一個單元格時,可以添加一個選項。你可以讓程序詢問他們是否想輸入更多的輸入,以防他們意識到他們需要向計算機輸入更多數據。 該程序將是相當簡單的,以及因爲有一種方法可以做到這一點plethera。隨時向我詢問這些方法,但我已經沒有空間了。 XD

-3

修改while循環如下。將s1聲明爲String s1;一次在循環之外。要結束循環,只需使用ctrl + z。

while (sc.hasNext()) 
    {  
    s1 = sc.next(); 
    System.out.println(s1); 
    System.out.print("Enter your sentence: "); 
    } 
0

您可以簡單地使用的檔案結尾依賴於系統的指標之一(d代表的Unix/Linux/Ubuntu的,Z爲窗口),以使while語句錯誤。這應該讓你很好地離開循環。:)

1

如果你不想使用此EOF符,你可以使用的StringTokenizer:

import java.util.*; 
public class Test{ 
    public static void main(){ 
     Scanner sc = new Scanner (System.in); 
     System.out.print("Enter your sentence: "); 
     String s=sc.nextLine(); 
     StringTokenizer st=new StringTokenizer(s," ");//" " is the delimiter here. 
     while (st.hasMoreTokens()) { 
     String s1 = st.nextToken(); 
     System.out.println(s1); 
     } 

     System.out.println("The loop has been ended"); 
    } 
}