2016-02-05 108 views
1
myObj a; 
int b = 1; 
int c = 1; 

if(b == c) { 
    a = new myObj(5); 
    b = 2; 
} 

if(a.getValue() == 5) { 
    .... 
} 

即使a將在它到達第二個if語句時始終被初始化,但我仍然無法編譯該程序,除非我在開​​始時聲明它。爲什麼「變量可能未被初始化」阻止編譯?

另外,如果我把myObj a = null,它工作,這基本上是一樣的,如果我剛離開它作爲myObj,但給出錯誤或防止編譯。

爲什麼「變量可能沒有被初始化」一個阻止編譯的錯誤,而不是一個警告? myObj a;myObj a = null;之間的區別是什麼?

+0

http://programmers.stackexchange.com/questions/257857/what-is-the-difference-between-uninitialized-object-variable-and-object-variable – OldProgrammer

+0

我想這只是爲了幫助程序員捕捉可能的錯誤(你通常想避免NRE)。 – Mephy

+2

'myObj a;'完全沒有價值。如果你沒有在那裏放置一個值,它只會是隨機垃圾。你必須手動將它清空(不像實例和類變量)。 – markspace

回答

3

爲什麼「變量可能沒有被初始化」一個阻止編譯的錯誤,而不是一個警告?

因爲警告往往被忽略,Java設計人員知道它。這是一個相對容易的解決方案,因此誤差成本爲零。

「myObj a;」和「和「myObj a = null;」?

第二個聲明說:「我想到初始值,它將爲空。」

第一個聲明說:「我還沒有決定初始值,也許以後。」

你的情況很有趣,因爲值總是要設置的,只是編譯器不夠聰明才能看到它。

+0

編譯器的設計非常聰明,看不到它:) – fge