2011-04-19 37 views
7

「與程序員負責初始化的方法的本地變量相比,Java語言自動初始化對象的字段。如果您知道關於程序內和程序間數據流分析的知識,請解釋語言設計人員爲什麼可能做出的這些設計選擇。「Java語言自動初始化對象字段的具體原因是什麼?

它對我來說很明顯,它可以防止一個bug。但是,那個bug究竟是什麼? 是否會濃縮某些給定方法的可能控制流?

有人可以在這個更詳細的?我真的很感激幫助。

+1

所以,你希望我們爲你回答你的作業問題嗎? – 2011-04-19 19:24:38

+0

哈哈,是的。對我感到羞恥嗎?對不起,如果我只是故意濫用這個網站。 – VitaminYes 2011-04-19 19:32:51

+3

幸運的是這個問題很有趣,所以沒有人在意= P – Claudiu 2011-04-19 19:33:32

回答

3

做內部程序數據流真的很容易,所以很容易檢查一個字段是否已經初始化,如果沒有的話可以給出警告(可以寫一個簡單的可判斷算法,例如確保所有的分支一個if初始化一個變量,並且如果一個分支沒有,失敗,即使分支不可達)。

這真的很難做的過程間的數據流,所以真的很難檢查對象的字段是否具有曾經代碼初始化任何地方(您快速進入不可判定境內任何合理的近似)。

因此,Java會處理前者,並在檢測到未初始化的局部變量時發出編譯時錯誤,但不會執行後者並將對象的字段初始化爲其默認值。

1

它們並不總是被初始化。通過結合使用反射和sun.misc.Unsafe或ObjectInputStream類來訪問這些類私有本地方法或直接通過JNI,可以實例化對象而無需調用任何構造函數。這些旨在用於對象序列化/反序列化的目的,並期望字段由解串器填充。至於爲什麼設計人員會選擇消除對這些方法的直接訪問(即沒有反射),這意味着仍然留在內存中的指針可用於堆棧粉碎或返回到lib-c攻擊。清除爲大多數程序「自動」分配的內存可降低安全風險並減少出錯的機率。還要注意,試圖讀取未初始化的局部變量會導致編譯錯誤,原因很多,原因很相似

相關問題