2011-06-15 64 views
1

我有一个Java项目和Eclipse工作(版本3.6.2)为IDE,一个枚举的比较,我得到一个奇怪的现象,继古怪的例子:的Java比较枚举(奇怪的行为)

全局变量:

StatusType status = StatusType.SIGNATURE; 

代码:

   String trsStatus = "END"; 
      if(trsStatus.equals("END") && (this.status.compareTo(StatusType.SIGNATURE) != 0)){ 
       //Do something 
       } 

这种比较成功,然后在if块,为什么呢?在这种情况下,if语句的第二次评估(this.status.compareTo(StatusType.SIGNATURE)!= 0)失败,因为结果为false!为什么java在块中输入?

如果我在Eclipse调试器的表达观察者评估表达的语句的值是:

trsStatus.equals( “END”)--->真

(this.status .compareTo(StatusType.SIGNATURE)= 0)--->假

我已经做了另一个测试,如果我在如果分配所述第二表达式的结果语句一个布尔变量:

boolean sign = (this.status.compareTo(StatusType.SIGNATURE) != 0); 

我得到这样的结果:

(!this.status.compareTo(StatusType.SIGNATURE)= 0)--->假

标志--->真

为什么?!?

这怎么可能?

+1

你确定你正在进入'if'块吗?你也可以定义一个'boolean'作为整个表达式,包括'&&',并检查它是否为false。 – toto2 2011-06-15 15:17:03

+0

是的,在if块中输入,令人难以置信......我也试着定义一个包含两个表达式的布尔变量,但问题依然存在。 – aleroot 2011-06-15 15:19:59

+0

那个var的价值是什么?假? – toto2 2011-06-15 15:23:47

回答

2

难道是StatusType以一种奇怪的方式覆盖compareTo()

是否有任何其他线程可能会更改status字段的值?

在任何情况下,您应该在此使用equals()甚至==而不是compareTo()

+0

'public final int compareTo(E o)'in'java.lang.Enum' ... – 2011-06-15 15:15:03

+0

我已经尝试过equals()和==,但问题是一样的... – aleroot 2011-06-15 15:20:32

2

this.status.compareTo(StatusType.SIGNATURE) != 0将返回零,因为零表示它们相等。 compareTo()根据哪个值被认为更大来返回1,-1或0。

0

您应该使用:this.status != StatusType.SIGNATURE

+0

也有了这个表达式我得到相同的不良结果。 – aleroot 2011-06-15 15:21:45

+0

使用调试器来查看比较时this.status的值。 – Marcelo 2011-06-15 15:31:47

0
public class Test { 
    public static void main(String[] args) { 
     TestEnum e = TestEnum.SIGNATURE; 
     System.out.println(e.compareTo(TestEnum.SIGNATURE)); 
     String test = "test"; 
     if (test.equals("test") && e.compareTo(TestEnum.SIGNATURE) != 0) { 
      System.out.println("I'm here"); 
     } 
    } 
} 

我做了以下测试。它不会进入if块并打印“我在这里”。

你能发布你的代码片段吗?

1

唯一明智的原因,我可以想像的是,

this.status != StatusType.SIGNATURE 

时期。你可能在不知不觉中将状态设置为其他值。也许与另一个线程。谁知道。在你的调试器中状态评估的是什么?

在任何情况下,Java中肯定没有这样的“bug”。除非你发布了一些证明它的代码;-)