2013-11-05 71 views
0

我在if語句之外聲明我的對象,但將它們初始化爲它。後來我嘗試並使用它們,但它不會允許它,因爲它們尚未初始化。 if語句的結構使它們在使用對象之前都會執行,因此對象將被保證初始化,但java不允許這樣做。任何方式在這個?使用循環內初始化的對象/變量?

+4

您應該發佈您的代碼 – Mik378

回答

2

如果你知道所有的路徑最終將它們初始化,但是編譯器沒有,你可以將它們初始化爲null0false(如AJB有益提醒) - 或其他一些特殊的初始值定義 - 當宣佈它們時。然後他們有一個具體的初始值。

如果變量仍然是null(或者它的初始值是什麼)在您使用它的時候(在對象的情況下可能由NPE證明),那麼您知道出了問題;您也可以稍後自行記錄您的假設。

你應該發佈你的代碼,這樣我們可以給你更好的建議;編譯器對於路徑分析相對來說比較聰明,當然它不能處理依賴外部輸入或假定前置條件和不變量的情況。儘管如此,你總是可能忽略了某些東西(也許是一個異常或意外情況導致了一個值未初始化的路徑 - 這很好,你只需確保它已經初始化)。

+2

@ user2954714有關變量需要初始化的規則也適用於類型爲「int」或「double」或「boolean」的非對象變量。這些可以初始化爲「0」或「假」。 – ajb

0

它們初始化爲null

Object myAwesomesauceVariableOfAwesome = null; 
if(myUnbelievablyWildBoolean){ 
    myAwesomesauceVariableOfAwesome = getAwesomesauce(); 
} 
doSomethingCompletelyMindBlowingWithAwesomesauce(myAwesomesauceVariableOfAwesome); 
1

唯一方式對象的初始化工作後,一個條件表達式,如果存在一個始終執行分支,如else陳述或switchdefault聲明。

要分解的是,利用這個實施例的代碼:

String word; 
String name = "Peter"; 
if("Peter".equals(name)) { 
    word = "The Bird"; 
} 
System.out.println(word); 

因爲編譯器識別其中word未被初始化的分支這將失敗。

如果添加了else子句,那麼編譯器會認爲word已初始化。

String word; 
String name = "Peter"; 
if("Peter".equals(name)) { 
    word = "The Bird"; 
} else { 
    word = "Nope"; 
} 
System.out.println(word); 
+0

+1因爲鳥*是*這個詞。 –

1

Java要求變量在其值可被引用之前沿着所有可能的路徑被初始化爲使用點。例如,如果你有

int x; 
if (a == b) { 
    x = 5; 
} 
if (c == d) { 
    x = 6; 
} 
int y = x; 

在上述情況下,編譯器無法知道第一或第二if聲明將是真實的,所以它不能肯定x被分配沿着通往分配的所有路徑的值到y。所以編譯器將不允許這樣做(並且,如果編譯器不拒絕這個,JVM中的「驗證器」會)。

解決的辦法是爲變量分配一個值(在這種情況下可能爲零或-1,對象引用爲null),這樣就知道它沿着所有路徑都有一個值。

但請注意,您可能不應該只爲您聲明的每個變量分配一個虛擬值,因爲通常情況下,沒有賦值的編譯器消息可能表示真正的實時代碼錯誤,因爲您不小心忽略了將值分配給沿着一些路徑的變量。