为什么“变量可能未被初始化”阻止编译?

问题描述:

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

为什么“变量可能没有被初始化”一个阻止编译的错误,而不是一个警告?

因为警告往往被忽略,Java设计人员知道它。这是一个相对容易的解决方案,因此误差成本为零。

“myObj a;”和“和“myObj a = null;”?

第二个声明说:“我想到初始值,它将为空。”

第一个声明说:“我还没有决定初始值,也许以后。”

你的情况很有趣,因为值总是要设置的,只是编译器不够聪明才能看到它。

+0

编译器的设计非常聪明,看不到它:) – fge