2012-09-22 72 views
2

可能重複:
How do I compare strings in Java?的Java:如何使用switch語句

我無法理解如何使用Java switch語句。在其中一個case語句中執行方法後,它仍然會轉到默認語句並運行該語句。代碼如下:

Scanner scanner = new Scanner(System.in); 
String option = null; 

while (option != "5") { 
    ShowMenu(); 
    option = scanner.nextLine(); 
    switch (option) { 
     case "1": ViewAllProducts(); break; 
     case "2": ViewProductDetails(scanner); break; 
     case "3": DeleteProduct(scanner); break; 
     case "4": AddProduct(scanner); break; 
     case "5": break; 
     default: System.out.println("Invalid option. Please try again."); break; 
    } 
} 

上面的代碼是主要的方法。例如,運行案例「4」後,它會打印「無效的選項」。

+1

必須是'while(!「5」.equals(option)){}' – adatapost

+0

哇。感謝大家..對我來說,這是一個C#編碼器,這是非常奇怪的..我們在C#中沒有這個問題。以上這些都不是問題。非常有趣的LOL。 – Matt

+0

問題是引用相等VS值相等和C#也有這個問題,但幸運的是在C#重載'=='運算符字符串。 – Premraj

回答

1

我修改代碼以讀出新的選項之前重新初始化掃描儀參考。 。

Scanner scanner = new Scanner(System.in); 
    String option = null; 

    ShowMenu(); 
    option = scanner.nextLine(); 

    while (!"5".equals(option)) { 
     switch (option) { 
      case "1": ViewAllProducts(); break; 
      case "2": ViewProductDetails(scanner); break; 
      case "3": DeleteProduct(scanner); break; 
      case "4": AddProduct(scanner); break; 
      case "5": break; 
      default: System.out.println("Invalid option. Please try again..."); break; 
     } 
     ShowMenu(); 
     scanner = new Scanner(System.in); // Add this here 

     option = scanner.nextLine(); // Use brand new scanner without any problem.. 
    } 

休息,你可以從我提供的鏈接閱讀,瞭解各種方法之間的差異讀取用戶輸入..

+0

感謝您在其他答覆和評論中給出了很好的解釋。 – Matt

+0

@Matt。不客氣:) –

+0

要小心:除非你明白*爲什麼*你需要創建一個新的掃描儀,這只是「巫術編程」。 –

6

你在你的while條件與==比較字符串(用於比較的引用而不是值 - use equals method for value equality),while循環應改爲以下 -

while (!option.equals("5")) 

它工作在C#完美,因爲operator overloading而運營商超載是not allowed in java(雖然「+」超載對於字符串和數字)

+0

感謝您的正確答案,但如果您還解釋了原因,它會更有幫助。所以,我會+1你是第一個,但薩米爾被標記爲「答案」 – Matt

+0

@馬特 - 其確定..我還添加了澄清:) – Premraj

+0

請看到我的編輯。這尚未解決。 – Matt

7
while (!option.equals("5")){...} 

使用.equals()字符串比較。

==比較字符串refrences(存儲位置) .equals()比較字符串值

1

我認爲這個問題是在while循環的條件。 您可以將條件更改爲while(!"5".equals(option)),然後嘗試運行該問題。

希望這可以幫助你。

1

您的scanner.nextLine()應該在您的時間之外。並且通常使用do-while與switch-case結合使用效果更好。因此,您可以更好地使用它。

當您從用戶讀取時,do-while與switch-case的一般用法就像這一點: -

boolean flag = false; 
do { 
    String option = scanner.nextLine(); 
    switch (option) { 
     case "1": break; 
     case "2": break; 
     default : flag = true; 
        break; 
    } 
} while(! flag); 

而且一個知道的重要的事情是: - 字符串是不可變在Java中..

一般在Java String比較,如果你要使用的equals()函數想要比較它們的值。而且,我建議你重寫這個equ als()和hashcode()方法在你的類(將來,如果你創建一個),比​​較你的類的兩個實例..

實際上,==和equals()之間有很大的區別。 它實際上取決於你如何創建你的字符串。,假設這是您的代碼: -

String a = "5"; 
String b = new String("5"); 
String c = "5"; or String c = a; 

System.out.println("a == b?" + (a == b)); // Will Print false 
System.out.println("a.equals(b)?" + a.equals(b)); // Will Print true.. 

System.out.println("a == c?" + (a == c)); // Will Print true 
System.out.println("a.equals(c)?" + a.equals(c)); // Will Print true.. 

在上面的代碼中,您的字符串的引用「a」和「c」分別指向由「5」表示相同的對象。而引用「b」指向另一個對象「5」,因爲使用「new」運算符創建一個String始終會創建一個新對象。

現在,==運算符檢查兩個String引用被比較的點相同的對象或不同的,而equals()方法函數比較由兩個字符串對象包含實際值..

因此,在該程序的輸出將是清楚現在.. 我剛纔解釋這是因爲在你的時候,你將不得不使用equals()函數來檢查你的「選項」引用是否具有與「5」相同的值。

現在,我想你可以改變你的代碼一點點,最好使用做,而獲得所需的輸出..

+0

更新問題謝謝。我會盡力解決您的問題。 – Matt

0

我停下來傳遞掃描儀各功能並創建了一個新的上e代替每個功能。這解決了問題。所以,我想通了這個問題..但是,我想知道爲什麼..

如果你發佈了一個SSCE,我們也許可以回答這個問題。不幸的是,您所描述的行爲涉及到您沒有向我們展示過的代碼。

這是Java中的錯誤還是正常?

這是極不可能這是一個Java錯誤。代碼已經在Java中使用了幾年,並且任何重大的錯誤都可能在之前遇到並被修復。另一方面,我可以想到,爲什麼將Scanner傳遞給一個方法將會產生任何影響本身沒有理由。

但是底線是沒有SSCE就無法弄清楚你的代碼真的在做什麼......並解釋根本原因。

如果我能理解爲什麼這是一個問題,那麼我可以在將來避免它與其他類太..除非這隻發生在掃描儀?

沒有SSCE我們不能幫你理解。