为什么“变量可能未被初始化”阻止编译?
问题描述:
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;
之间的区别是什么?
答
为什么“变量可能没有被初始化”一个阻止编译的错误,而不是一个警告?
因为警告往往被忽略,Java设计人员知道它。这是一个相对容易的解决方案,因此误差成本为零。
“myObj a;”和“和“myObj a = null;”?
第二个声明说:“我想到初始值,它将为空。”
第一个声明说:“我还没有决定初始值,也许以后。”
你的情况很有趣,因为值总是要设置的,只是编译器不够聪明才能看到它。
+0
编译器的设计非常聪明,看不到它:) – fge
http://programmers.stackexchange.com/questions/257857/what-is-the-difference-between-uninitialized-object-variable-and-object-variable – OldProgrammer
我想这只是为了帮助程序员捕捉可能的错误(你通常想避免NRE)。 – Mephy
'myObj a;'完全没有价值。如果你没有在那里放置一个值,它只会是随机垃圾。你必须手动将它清空(不像实例和类变量)。 – markspace