富="杆&#34 ;; if(foo ==" bar"){doX(); }其他{"但这总是运行"为什么?

时间:2016-04-27 10:42:27

标签: java string-comparison

我的类实现了一个非常简单的RPN计算器原型。

以下构造不起作用。为什么?我在这里做错了什么?

public boolean executeCommand(String command) {
    if(command == "+")      { add();          return true; }else
    if(command == "-")      { subtrair();     return true; }else
    if(command == "*")      { multiplicar();  return true; }else
    if(command == "/")      { dividir();      return true; }else
        {
            System.out.println("The command does not exist.");
            return false;
        }
}

输出总是,无论字符串包含什么,

The command does not exist.

为什么呢?我真的不明白!如果有人可以解释,我会感激不尽!

更详细

有问题的方法是:

public boolean executeCommand(String command) {
    Scanner str = new Scanner(command);

    if (str.hasNextDouble()) {
        dataStack.push(str.nextDouble());
        return true;
    } else {

        System.out.format(" DEBUG: command: %s$%n", command);

        if(command == "+")      { add();          return true; }else
        if(command == "-")      { subtract();     return true; }else
        if(command == "*")      { multiply();     return true; }else
        if(command == "/")      { divide();       return true; }else
        if(command == ".")      { print();        return true; }else
        if(command == ".s")     { showStack();    return true; }else
        if(command == "exit")   { exit();         return true; }else
            {
                System.out.println("The command does not exist.");
                return false;
            }
    }
}

对于任何输入我扔了它,(当然除了数字),导致:

 DEBUG: command: [COMMAND HERE]$
The command does not exist.

源代码

我删除了一些不相关的源代码; (即一些方法,包名称)但它仍然可编译和可运行:

import java.util.Scanner;
import java.util.LinkedList;

public class RPNCalculator {

    public static void main(String[] args) {
        RPNCalculator calc = new RPNCalculator();
        calc.startInteractiveMode();
    }

    protected Scanner scanInput;
    public LinkedList<Double> dataStack;
    protected boolean interactiveModeEnabled;

    public RPNCalculator() {
        scanInput = new Scanner(System.in).useDelimiter("\\s+");
        dataStack = new LinkedList<Double>();
    }

    public String getCommand() {
        return scanInput.next();
    }

    public boolean executeCommand(String command) {
        Scanner str = new Scanner(command);

        if (str.hasNextDouble()) {
            dataStack.push(str.nextDouble());
            return true;
        } else {

            System.out.format(" DEBUG: command: %s$%n", command);

            if(command == "+")   { ommitedOp("add");      return true; }else
            if(command == "-")   { ommitedOp("subtract"); return true; }else
            if(command == "*")   { ommitedOp("multiply"); return true; }else
            if(command == "/")   { ommitedOp("divide");   return true; }else
            if(command == ".")   { ommitedOp("print");    return true; }else
            if(command == ".s")  { ommitedOp("showStack");return true; }else
            if(command == "exit"){ ommitedOp("exit");     return true; }else
                {
                    System.out.println("The command does not exist.");
                    return false;
                }
        }
    }

    public void startInteractiveMode() {
        interactiveModeEnabled = true;

        while (interactiveModeEnabled) {
            String command = getCommand();
            executeCommand(command);
        }
    }

    public void ommitedOp(String method){
        System.out.println("Command exists!");
    }
}

2 个答案:

答案 0 :(得分:1)

......我想我明白了。谢谢,Stack Overflow的相似问题!

问题在于我如何尝试使用==运算符,该运算符仅比较指针而非String自身:https://stackoverflow.com/a/10535836/3397179

  

在Java中,您必须使用equals()来比较String之间的相等性。 ==测试身份,这是一个不同的概念。

     

两个物体可以相等但不相同;另一方面,如果两个对象相同,则暗示它们是相等的。

     

如果两个对象在物理上指向内存中的相同地址,则两个对象是相同的,而如果它们具有相同的值,则两个对象相同,如equals()方法中的程序员所定义。一般来说,你更感兴趣的是找出两个对象是否相等。

     

- 由Óscar López

于12月10日14:11回答

现在,让我们在发布之前测试一下这个理论,避免让自己变得愚蠢,不必要地浪费别人的时间......确认。

因此,解决方案是使用command.equals("COMMAND NAME")代替command == "COMMAND NAME",如下所示:

public boolean executeCommand(String command) {
    if(command.equals("+"))      { add();          return true; }else
    if(command.equals("-"))      { subtrair();     return true; }else
    if(command.equals("*"))      { multiplicar();  return true; }else
    if(command.equals("/"))      { dividir();      return true; }else
        {
            System.out.println("The command does not exist.");
            return false;
        }
}

答案 1 :(得分:1)

command == "+"   // always checks for reference and it will be never same.

而是使用下面的

command.equals("=")