2012-10-12 60 views
1

我想知道爲什麼這個代碼片斷編譯和運行爲什麼下面的代碼會被編譯?

private BusRoute readRouteCursor(final Cursor c) 
{ 
    final BusRoute result; 
    final int count; 
    if (c == null || (count = c.getCount()) < 1) 
    { 
     result = null; 
    } 
    else 
    { 
     /* 
     * Reads cursor 
     */ 
    } 
    return result; 
} 

我有它工作得很好,但是當我停下來想想我不知道爲什麼,作爲變量countfinal但很有可能它不如果滿足if子句的第一個條件,則設置該值。

它是否工作,因爲編譯器足夠聰明,從這一點上看沒有count的用法,它不需要初始化?

+3

最後一個變量只能初始化一次,所以從你向我們展示的代碼是很好的。 – andre

+0

結果只有一個初始化,在這裏 – njzk2

+0

感謝您清除那一個球員:) – ScouseChris

回答

4

你已經自己回答了這個問題!由於除條件初始化外沒有對count變量的引用,因此不會報告編譯錯誤。只有當您嘗試在方法主體中進一步引用該變量時,該錯誤纔會顯示。

0

這是一個非常有效的場景,因爲您首次初始化變量count。剛剛嘗試寫:

final int count = 0; 

你會得到一個編譯錯誤

2

答案很簡單。最後一個變量不需要在聲明步驟中初始化。它也被稱爲「空白決賽」。

1

實際上,這隻有在count變量是對象或類的字段時纔會失敗。

爲什麼?因爲缺省值是爲字段默認分配的。因此,您的發言:

count = c.getCount()

將有效地失敗,因爲這將是第二個任務......

然而,對於局部變量,是不是同時在作出宣佈指派的缺省值。

因此,您的代碼完全有效,因爲您的count變量永遠不會超過一次。