2011-09-23 88 views
3

我有一個if語句檢查一些值,並遇到一個奇怪的錯誤(不知道!)。我的代碼在語法上不正確,導致它產生了錯誤的結果,但是eclipse在編譯時沒有引發任何錯誤。爲什麼我的以下代碼工作?爲什麼沒有編譯時錯誤?奇怪 - Java

if((this.trackPointList.get(point).getTurnOutId().equals(seg.getSegRef().getTurnOut())) && seg.getSegRef().getKind().equals("arc")); // <---- See here I have semicolon 
    { 
     ... code to run ... 
    } 

上面的代碼檢查僅第一個條件,而忽略seg.getSegRef().getKind().equals("arc"),但我想這應該在編譯時提出的一個問題,我說得對不對?我的邏輯工作,一旦我調試它逐行撇取,並發現這個分號。如果有人能解釋,如果它是一個有效的語法,我將不勝感激。

請賜教!

+0

的IntelliJ會給你一個警告馬上。 – irreputable

回答

11

;使Java認爲if條件的主體是完整的,即使在它之前沒有其他代碼。實際上,執行if語句中的代碼,但不存在主體,因爲;在那裏。

{ ...code to run...}只是一個代碼塊,執行該代碼塊內的任何聲明,並且該代碼塊在代碼塊外部不可見。它總是在這裏運行,因爲它不是if塊的一部分。

編輯:這裏是關於{ }塊另一個堆棧溢出問題:What do curly braces in Java mean by themselves?

+0

現在這是有道理:),我認爲它是語法不正確謝謝堆棧(我喜歡堆棧,而不是堆;)) – doNotCheckMyBlog

2

的代碼語法正確。你可以寫ifs沒有大括號,如:

if(condition) statement; 

具有空語句也是有效的。比如這段代碼是有效的:

int a = 0;; 
;;; 

所以空,如果是有效的爲好,儘管它沒有多大意義:)

if(condition); 
+0

謝謝麥克斯,我會記住這一點:) – doNotCheckMyBlog

1

;if(..)聲明表示空語句之後當if(..)的計算結果爲真時,這是有條件地執行的。 { .. }表示始終使用其自己的作用域執行的代碼塊。

如果由於short-circuit evaluation而導致第一個條件爲假,則可以忽略第二個條件。

2

if語句後跟分號稱爲「空if語句」。 它很少有任何用處,但它在語法上是合法的。

你可以寫這樣的事情

if (doSomethingThatReturnsABoolean()) 
    ; // Empty statement 
else 
    doSomeOtherThing() 

,但它會更好寫

if (!doSomethingThatReturnsABoolean()) 
    doSomeOtherThing() 

關於你的觀察,只有第一個條件被檢查: 如果第一個條件返回false的第二個條件不會被檢查,因爲

(false && secondCondition) 

總是等於false,所以secondCondition的值是不相關的。

1

if(condition);等同於if(condition){}

for loop & while loop同樣的事情:

for(;condition;);相當於for(;condition;){}

while(condition);相當於while(condition){}