2011-06-15 79 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」。除非你發佈了一些證明它的代碼;-)