2012-09-22 151 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我们不能帮你理解。