在许多示例代码中,我看到用空值实例化的变量,后来分配了更有意义的值。
我只是想知道为什么人们会这样做。我猜测try-catch块可能会进入这个,但我也看到变量实例化将在try块内部为null值。
(我确信这是一个与语言无关的问题,但仅供参考,我几乎完全使用Java编程)
所有见解都很受欢迎!
答案 0 :(得分:13)
Java编译器在某些情况下会检测是否所有可能的控制流中都没有初始化变量并输出错误。要避免这些错误消息,必须显式初始化变量。
例如在这种情况下:
public Integer foo() {
Integer result;
if (Math.random() < 0.5) {
result = 1;
}
return result;
}
编译器会给出以下错误消息:“本地变量结果可能尚未初始化”。
以下是Java Language Specification所说的内容:
每个局部变量(§14.4)和每个空白决赛(§4.5.4) 字段(第8.3.1.2节)必须具有明确赋值 任何对其价值的访问都会发生。 Java编译器必须携带 进行特定的保守流量分析,以确保, 对于局部变量或空白最终场f的每次访问, f在访问之前是明确分配的;否则一个 必须发生编译时错误。
请注意(与字段相反!)局部变量不会自动初始化为null
。
答案 1 :(得分:4)
就个人而言,我不喜欢它会在构造函数中获取值的成员字段。曾经有一段时间我认为明确是好的,但实际上将字段明确地指定为null或者采用默认值的字段之间存在字节码差异。
即使对于以null开头的字段(然后在初始化后的某个时间获得一个值),我也不是他们的忠实粉丝。它通常只是突出了开发人员的误解。
try-catch相关性是这样的:
Reader r = null;
try {
r = ...;
//do something that could throw an exception
} finally {
if ( r != null ) { //wouldn't compile without assignment to null
r.close();
}
}
因为r
是一个局部变量,所以它在使用之前需要一个值,所以分配是必要的。如果null的赋值发生在与后续重新分配和/或使用相同的代码路径中,那可能只是误导冗余。
答案 2 :(得分:0)
是的,多次想到这个问题。
目前,我通常为对象提供初始值null
,为简单类型提供无意义值。原因,有时你不能确定JRE给变量赋予初始值。有时你需要判断变量是否为空,也许你忘了初始化它。有些错误很容易找到,If给变量一个初始值。