局部变量初始化null和不初始化之间的区别?
在Java中,有什么区别和最佳方法?
Integer x = null; // x later assign some value. Integer y; // y later initialize and use it.
答案取决于您所指的变量类型。
对于类变量 ,没有区别,请参阅JLS – 4.12.5。 变量的初始值 :
…程序中的每个变量在使用其值之前必须具有值:
对于所有引用类型(第4.3节 ),默认值为
null
。
意思是没有区别,后者隐式设置为null
。
如果变量是本地变量,则必须先将它们分配,然后再将它们传递给方法:
myMethod(x); //will compile :) myMethod(y) //won't compile :(
最好不要将它设置为null,否则你可以偶然使用它并导致NPE。 编译器不会帮助您编译错误。 如果你想要像if(x!= null){/ use it /}这样的逻辑,只设置为null
必须在使用之前将局部变量分配给某些东西。
Integer x = null; myFunction(x); // myFunction is called with the argument null Integer y; myFunction(y); // This will not compile because the variable has not been initialised
如果没有显式初始化类变量,则总是将类变量初始化为默认值(对象类型为null
,对于基元类似于零)。 局部变量不会被隐式初始化。
没有任何区别。 无论何时你想要使用它,局部变量必须是初始化forms(必须有一个值)。
来自Java
doc
与对象如何在字段中存储其状态类似,方法通常将其临时状态存储在局部变量中。 声明局部变量的语法类似于声明字段(例如,int count = 0;)。 没有特殊的关键字将变量指定为本地; 该决定完全来自声明变量的位置 – 它位于方法的开括号和右括号之间。 因此,局部变量只对声明它们的方法可见; 他们无法从class上其他人那里获得。
没有任何差异可以预期一件事,如果你没有初始化它,稍后你尝试使用这个变量(不改变引用)意味着在编译时出错,但如果你初始化它并稍后使用它(不更改引用)表示NullPointerException。
我给你看一个例子。
没有初始化
Integer y; y.intValue(); // Compilation error
初始化
Integer x = null; x.intValue(); // You are able to compile it but NullPointerException
在内部没有区别。 这也是一个值得商榷的话题。
仅在确实需要时才使用局部变量。 局部变量主要在以下场景中(我可能会缺少其他几个)。
作为速记或可读性
Integer myObject = someObject.someFunction().someOtherFunction();
如果我们在许多地方使用这样的语法,代码将变得笨拙。
为了方便
Object returnObject = null; if(mycondition) { returnObject = value1; } else if(secondCondition) { returnObject = value2; } return returnObject;
上述代码段的调用者将根据返回值做出决定。 老实说,我没有看到其他有效的用例来声明没有初始值的变量。
结论(最佳实践):
- 仅在需要时声明局部变量
- 始终使用默认值创建局部变量。