0

I try to program a calculator in order to learn the very begining in android dev, but I'm facing to an issue that an human can't understand. I hope you're not human.

Take a look at my If condition :

    if (result != "")
    {
        textView.append("0");

    }

(You may notice that I used « result != "" » instead of isEmpty() method because isEmpty() isn't supported in API7).

Well. Now take a look at my two "result" variable

result  "" (id=830012674816)    
count   0   
hashCode    0   
offset  0   
value    (id=830012674848)  

result  "" (id=830022154000)    
count   0   
hashCode    0   
offset  0   
value    (id=830022154032)  

(I copied that two results from Eclipse Debugger)

The first result is OK : that's the one I get when I start the program : the if does its job and pass over. The second one seems to be exactly the same, but for a unknown reason, it gets inside the if and appends the zero. I get this issue after pushing the "plus" button.

Any idea ?

If you find there is a lack of information or you don't understand the issue, you can find here the whole workspace (in progress) : http://www.sendspace.com/file/udp5d3 . To reproduce the issue, push "zero" button when programs launchs and note that it normally does not appear. Then enter any number such as "104", "7" or "73", push "Plus" button, then "zero". Zero should not appear here.

Thank you :)

4

7 回答 7

5

不要用 . 比较字符串(或任何对象)!=。使用equals()喜欢!("".equals(result))!(result.equals(""))

==用于检查引用是否包含相同的对象,而不是对象是否包含相同的值,

例如

Integer i1=new Integer(1);
Integer i2=new Integer(1);
Integer i3=i1;
//checking references
System.out.println(i1==i2);//false
System.out.println(i1==i3);//true

//checking values
System.out.println(i1.equals(i2));//true
System.out.println(i1.equals(i3));//true
于 2012-07-16T12:11:18.397 回答
1

改变:

if (result != "")

至:

if (!result.equals(""))

或更优选地,也使用TextUtilswhich 检查null

if(!TextUtils.isEmpty(result))
于 2012-07-16T12:12:12.330 回答
0

您的if子句中的表达式检查变量中的引用(而不是值)result是否不等于对象"",这就是您始终为真的原因。而不是result != ""使用!result.equals("").

于 2012-07-16T12:13:29.503 回答
0

你需要调用这个方法!result.equals("")

result == " "将比较对象实例而不是字符串对象的内容。

于 2012-07-16T12:13:49.563 回答
0

尝试contentEquals改用。例如

if (!result.contentEquals(""))

http://developer.android.com/reference/java/lang/String.html#contentEquals(java.lang.CharSequence )

原因是,在 Java 中,==如果两个对象引用指向同一个实例,则返回 true,而您想比较两个字符串以检查它们是否以相同的顺序包含相同的字符,这不是一回事。

于 2012-07-16T12:10:28.690 回答
0

1.对象.equals()在Java中比较,String在Java中是一个Object。

2.所以 String 必须遵循同样的规则。

例子:

 if (!(result.equals("")))
    {
        textView.append("0");

    }
于 2012-07-16T12:24:02.830 回答
0

正如其他答案所说,应该使用String.equals()比较两个的实际内容Strings(参见equalsjavadocs 中的描述),而不是通过==.

但是,正如您在问题中指出的那样,==当您的应用程序第一次运行比较时,使用评估为 true 的两个字符串。这是因为String interning发生的。最有可能的是,在变量的初始化过程中,您已将 分配result给与稍后比较的相同值的常量 - "". 然后,由于 JVM 使用实习来仅保留String给定值的单个常量实例,因此result变量包含的引用实际上与比较中对常量的引用相同,并且相等性测试评估为真。

因此,存在(相当特殊的)情况,适合==用于比较字符串。请参阅此问题,这是列表和进一步讨论的最佳答案。

于 2012-07-16T12:56:24.367 回答