Java «;如果»;变得疯狂
我试图编写一个计算器来学习android开发的最开始,但我面临着一个人类无法理解的问题。我希望你不是人类 请查看我的If条件:Java «;如果»;变得疯狂,java,android,eclipse,Java,Android,Eclipse,我试图编写一个计算器来学习android开发的最开始,但我面临着一个人类无法理解的问题。我希望你不是人类 请查看我的If条件: if (result != "") { textView.append("0"); } (您可能会注意到,我使用了«result!=”“»而不是isEmpty()方法,因为在API7中不支持isEmpty() 嗯。现在看看我的两个“result”变量 result "" (id=830012674816) count
if (result != "")
{
textView.append("0");
}
(您可能会注意到,我使用了«result!=”“»而不是isEmpty()方法,因为在API7中不支持isEmpty()
嗯。现在看看我的两个“result”变量
result "" (id=830012674816)
count 0
hashCode 0
offset 0
value (id=830012674848)
result "" (id=830022154000)
count 0
hashCode 0
offset 0
value (id=830022154032)
(我从Eclipse调试器复制了这两个结果)
第一个结果是确定的:这就是我启动程序时得到的结果:if完成了它的工作并通过了。
第二个似乎完全相同,但不知为什么,它进入if并附加零。我在按下“加号”按钮后发现了这个问题
有什么想法吗
如果您发现缺少信息或不了解问题,您可以在此处找到整个工作区(正在进行):。
要重现该问题,请在程序启动时按“零”按钮,并注意它通常不会出现。然后输入任何数字,如“104”、“7”或“73”,按“加号”按钮,然后按“零”。零不应该出现在这里
谢谢:)尝试改用
contentEquals
。例如
if (!result.contentEquals(""))
)
原因是,在Java中,如果两个对象引用指向同一个实例,则返回true,而您希望比较两个字符串以检查它们是否以相同的顺序包含相同的字符,这不是一回事。尝试改用
contentEquals
。例如
if (!result.contentEquals(""))
)
原因是,在Java中,如果两个对象引用指向同一个实例,则返回true,而您希望比较两个字符串以检查它们是否包含相同顺序的相同字符,这是不同的。不要通过比较字符串(或任何对象)=代码>。像一样使用equals()
!(“”.equals(result))
或!(结果等于(“”)
=
用于检查引用是否包含相同的对象,而不是对象是否包含相同的值
比如说
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
不要通过比较字符串(或任何对象)=代码>。像一样使用equals()
!(“”.equals(result))
或!(结果等于(“”)
=
用于检查引用是否包含相同的对象,而不是对象是否包含相同的值
比如说
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
更改:
if (result != "")
致:
或者更优选地,使用TextUtils
也检查null
:
if(!TextUtils.isEmpty(result))
更改:
if (result != "")
致:
或者更优选地,使用TextUtils
也检查null
:
if(!TextUtils.isEmpty(result))
if
子句中的表达式检查变量result
中的引用(而不是值)是否不等于对象“”
,这就是为什么总是为真。而不是result!=“
使用!result.equals(“”)
如果if
子句中的表达式检查变量result
中的引用而不是值是否不等于对象“”
,这就是为什么始终为true。而不是result!=“
使用!result.equals(“”)
您需要调用此方法!结果.等于(“”)
result==”
将比较对象实例而不是字符串对象内容。您需要调用此方法!结果.等于(“”)
result==”
将比较对象实例而不是字符串对象内容。1。对象在Java中使用.equals()
进行比较,字符串在Java中是一个对象
2.因此字符串必须遵循相同的规则
例如:
if (!(result.equals("")))
{
textView.append("0");
}
1。对象在Java中使用.equals()
进行比较,字符串在Java中是一个对象
2.因此字符串必须遵循相同的规则
例如:
if (!(result.equals("")))
{
textView.append("0");
}
正如其他答案所说,应该使用String.equals()
来比较两个字符串的实际内容(参见javadocs中的说明),而不是通过=
测试对象引用的相等性
但是,正如您在问题中所指出的,在应用程序第一次运行比较时,对计算为true的两个字符串使用=
。发生这种情况是因为。最可能的情况是,在变量初始化过程中,您已将结果
分配给一个常数,该常数的值与您稍后比较的值相同,即“
。
然后,由于JVM使用interning只保留给定值的String
常量的单个实例,因此result
变量包含的引用实际上与比较中对常量的引用相同,相等性测试评估为true
因此,有些(相当特殊的)情况下,使用=
比较字符串是合适的。请参阅,这是列表和进一步讨论的最佳答案。正如其他答案所说,应该使用String.equals()
来比较两个字符串的实际内容(请参阅javadocs中的说明),而不是通过=
测试对象引用的相等性
但是,正如您在问题中所指出的,在应用程序第一次运行比较时,对计算为true的两个字符串使用=
。发生这种情况是因为。最可能的情况是,在变量初始化过程中,您已将结果
分配给一个常数,该常数的值与您稍后比较的值相同,即“
。
然后,由于JVM使用interning只保留给定值的String
常量的单个实例,因此result
变量包含的引用实际上与比较中对常量的引用相同,相等性测试评估为true
因此,有些(相当特殊的)情况下,使用=
比较字符串是合适的。看到了吗