2012-05-12 109 views
2

我試圖寫這個方法,它一直向用戶讀取,直到輸入「exit」這個單詞。我嘗試了休息和循環;它沒有工作。我一直在嘗試,但即使輸入「退出」一詞也不會停止。任何想法如何解決這一問題?謝謝。停止從閱讀用戶輸入java的掃描儀?

public void read(Scanner scanner){ 

while(3<4){ 
String in = scanner.nextLine(); 
Scanner scanner_2 = new Scanner(in); 

String name = null; 

if(scanner_2.hasNext()){ 
    //create and add the user to the user container class 
    name = scanner_2.next(); 
    System.out.println(name); 
} 

if(name == exit) 
//stop or break the while loop 
} 
} 
+2

而不是'while(3 <4)',爲什麼不直接使用'while(true)'? – Jeffrey

+0

Thansk的建議。我不知道我能做到這一點 – FranXh

回答

9

name == exit是錯誤的。

你想

name.equals(exit) 

name.equals("exit") 

取決於出口是否是一個變量或文字字符串,分別。在Java中,==表示引用相等(例如,這兩個引用指向內存中的相同地址),而。 equals意味着對象等價,這通常是開發人員在課堂上的overriden

+0

我認爲這是問題,等於一部分。現在它可以工作。非常感謝:D – FranXh

+0

沒問題,很高興我能幫上忙。 –

3

Amirs的回答是100%正確的。另外,在while循環中使用true,我認爲在這種情況下最好使用else ... if語句。更可讀,這就是爲什麼:)

3

假設String exit = "exit";聲明AR類級別的地方:

name == exit 

檢查對象是否通過name引用和exit引用的對象是相同的。你想要的是對象name所引用的對象和exit引用的對象是否相同。

你做到這一點的

if(name.equals(exit)) 

這就是說,有很多的事情可以在代碼中得到改善。我知道你可能正在編寫這個代碼來學習java,但是一些小的改變可以使代碼更具可讀性。

另外,您使用的第二臺掃描儀根本不需要。

下面的代碼會做同樣的事情,你的代碼,但體積更小,更具可讀性。

String name = ""; 
    while(!name.equals("exit")) { 
     if(scanner.hasNext()) { 
      //create and add the user to the user container class 
      name = scanner.next(); 
      System.out.println(name); 
     } 

    } 

其實他的代碼可以進一步提高爲:

String name = null; 
while(scanner.hasNext() && !(name = scanner.next()).equals("exit")) { 
    System.out.println(name); 
} 

但我認爲你正在學習,這可能有點當你正在學習的太多了。

5
if(name == exit) 

這是真的。

但要確保同時比較兩個字符串,當一個字符串是恆定的例如"exit"然後確保比較時它首先出現。

即應該相比

if ("exit".equals(name)) 

不如下方式

if (name.equals("exit")) 

的主要原因製作的「退出」作爲第一個值,如果名稱是null那麼它將不火NullPointerException但如果我們把name作爲比較的第一個對象,那麼如果name爲null,那麼它將觸發該異常,因此請確保將來有此事。