2

可能重复:
如何比较 Java 中的字符串?

我无法理解如何使用 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;
    }
}

上面的代码在 main 方法中。例如,在运行案例“4”后,它会打印“无效选项”。

4

6 回答 6

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

用于.equals()字符串比较。

==比较字符串引用(内存位置) .equals()比较字符串值

于 2012-09-22T08:59:08.857 回答
6

您正在将字符串与==您的 while 条件(比较引用而不是值 -使用equals值相等的方法)进行比较,while 循环应更改为以下 -

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

由于运算符重载,它在 C# 中完美地工作,而在 Java 中不允许运算符重载(尽管“+”对于字符串和数字被重载)

于 2012-09-22T08:58:08.137 回答
1

我认为问题出在while循环的情况下。您可以将条件更改为while(!"5".equals(option))然后尝试运行问题。

希望这对您有所帮助。

于 2012-09-22T09:10:14.097 回答
1

您的scanner.nextLine() 应该在您的while 之外。通常 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 中的字符串比较,如果你想比较它们的值,你应该使用 equals() 函数。而且,我建议你在你的类中重写这个 equals() 和 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”运算符创建字符串总是会创建一个新对象。

现在,== 运算符检查被比较的两个字符串引用是指向同一个对象还是不同,而equals()函数比较两个字符串对象包含的实际值。

因此,程序中的输出现在将很清楚了。我只是解释了这一点,因为在您的 while 中,您将不得不使用 equals() 函数来检查您的“选项”引用是否与“5”具有相同的值。

现在,我认为您可以稍微更改您的代码,并且最好使用 do-while 来获得所需的输出..

于 2012-09-22T11:26:37.117 回答
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..
    }

休息,你可以从我提供的链接中阅读,了解读取用户输入的各种方法之间的区别..

于 2012-09-23T01:20:28.680 回答
0

我停止将扫描仪传递给每个函数,而是在每个函数中创建了一个新函数。这解决了问题。所以,我想出了这个问题..但是,我想知道为什么..

如果您发布了 SSCE,我们可能会回答这个问题。不幸的是,您所描述的行为涉及您没有向我们展示的代码。

这是Java中的错误还是正常的?

不太可能是 Java 错误。该Scanner代码已经在 J​​ava 中使用了几年,任何重大错误都可能在之前遇到过并已修复。

另一方面,我想不出为什么将 a 传递Scanner给方法本身会产生任何影响。

但最重要的是,如果没有 SSCE,就不可能弄清楚你的代码到底在做什么……并解释根本原因。

如果我能理解为什么这是一个问题,那么我将来也可以在其他课程中避免它。除非这只发生在 Scanner 上?

没有 SSCE,我们无法帮助您理解。

于 2012-09-23T01:39:44.750 回答