我在if語句之外聲明我的對象,但將它們初始化爲它。後來我嘗試並使用它們,但它不會允許它,因爲它們尚未初始化。 if語句的結構使它們在使用對象之前都會執行,因此對象將被保證初始化,但java不允許這樣做。任何方式在這個?使用循環內初始化的對象/變量?
回答
如果你知道所有的路徑最終將它們初始化,但是編譯器沒有,你可以將它們初始化爲null
或0
或false
(如AJB有益提醒) - 或其他一些特殊的初始值定義 - 當宣佈它們時。然後他們有一個具體的初始值。
如果變量仍然是null
(或者它的初始值是什麼)在您使用它的時候(在對象的情況下可能由NPE證明),那麼您知道出了問題;您也可以稍後自行記錄您的假設。
你應該發佈你的代碼,這樣我們可以給你更好的建議;編譯器對於路徑分析相對來說比較聰明,當然它不能處理依賴外部輸入或假定前置條件和不變量的情況。儘管如此,你總是可能忽略了某些東西(也許是一個異常或意外情況導致了一個值未初始化的路徑 - 這很好,你只需確保它已經初始化)。
@ user2954714有關變量需要初始化的規則也適用於類型爲「int」或「double」或「boolean」的非對象變量。這些可以初始化爲「0」或「假」。 – ajb
它們初始化爲null
Object myAwesomesauceVariableOfAwesome = null;
if(myUnbelievablyWildBoolean){
myAwesomesauceVariableOfAwesome = getAwesomesauce();
}
doSomethingCompletelyMindBlowingWithAwesomesauce(myAwesomesauceVariableOfAwesome);
的唯一方式對象的初始化工作後,一個條件表達式,如果存在一個始終執行分支,如else
陳述或switch
default
聲明。
要分解的是,利用這個實施例的代碼:
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);
+1因爲鳥*是*這個詞。 –
Java要求變量在其值可被引用之前沿着所有可能的路徑被初始化爲使用點。例如,如果你有
int x;
if (a == b) {
x = 5;
}
if (c == d) {
x = 6;
}
int y = x;
在上述情況下,編譯器無法知道第一或第二if
聲明將是真實的,所以它不能肯定x
被分配沿着通往分配的所有路徑的值到y
。所以編譯器將不允許這樣做(並且,如果編譯器不拒絕這個,JVM中的「驗證器」會)。
解決的辦法是爲變量分配一個值(在這種情況下可能爲零或-1,對象引用爲null
),這樣就知道它沿着所有路徑都有一個值。
但請注意,您可能不應該只爲您聲明的每個變量分配一個虛擬值,因爲通常情況下,沒有賦值的編譯器消息可能表示真正的實時代碼錯誤,因爲您不小心忽略了將值分配給沿着一些路徑的變量。
- 1. 使用變量初始化對象
- 2. 對象變量初始化
- 3. JavaScript:初始化對象後初始化內部變量
- 4. 使用IntellijIDEA在For循環中未初始化循環變量
- 5. 在循環中初始化變量 - 使用全局變量?
- 6. 雙循環變量初始化
- 7. foreach未初始化循環變量
- 8. 在while循環中初始化變量
- 9. 未初始化變量中While循環
- 10. 在循環中初始化變量
- 11. 初始化變量在for循環
- 12. 一個循環中初始化變量
- 13. 初始化對象時,實例變量始終未初始化?
- 14. 如何使用已在for循環中初始化的變量?
- 15. PMD:避免初始化新對象的內部循環
- 16. 環路初始化變量
- 17. C++,而內部聲明和初始化變量循環
- 18. 變量繼續在循環內重新初始化?
- 19. 在c#中初始化對象變量?
- 20. Rails - 初始化對象實例變量
- 21. 使用for循環初始化數組和變量名C#
- 22. 使用foreach循環來初始化變量
- 23. 儘管循環變量初始化和變量類型(C)
- 24. 矢量對象初始化
- 25. 初始化變量,並在改變其值的for循環
- 26. 使用矢量的內容初始化類對象
- 27. 用不同的方法初始化變量/對象與全局初始化
- 28. 一個循環內初始化
- 29. 使用變量創建/初始化新對象
- 30. 批次重新初始化循環內的全局變量,並在循環外使用它
您應該發佈您的代碼 – Mik378