局部变量初始化null和不初始化之间的区别?

时间:2014-10-02 11:54:00

标签: java

在Java中,有什么区别和最佳方法?

Integer x = null; // x later assign some value.
Integer y; // y later initialize and use it.

6 个答案:

答案 0 :(得分:8)

答案取决于您所指的变量类型。

对于类变量,没有区别,请参阅JLS - 4.12.5. Initial Values of Variables

  

...程序中的每个变量必须在其值之前具有值   使用:

     

对于所有引用类型(§4.3),默认值为null

含义,没有区别,后者隐式设置为null

如果变量是 local ,则在将它们传递给方法之前必须先分配它们:

myMethod(x); //will compile :)
myMethod(y)  //won't compile :(

答案 1 :(得分:3)

完全没有区别。无论何时你想要使用它,局部变量必须是初始化形式(必须有一个值)。

来自Java doc

  

类似于对象如何在字段中存储其状态,方法将如此   经常将其临时状态存储在局部变量中。的语法   声明局部变量类似于声明一个字段(for   例如,int count = 0;)。没有特殊的关键字指定a   变量为本地变量;这个决定完全来自这个地方   声明变量的位置 - 在开头和开头之间   关闭方法的大括号。因此,局部变量仅可见   他们被宣布的方法;他们无法访问   来自班上其他人。

答案 2 :(得分:3)

最好不要将其设置为null,否则您可能会意外地使用它并导致NPE。编译器不会帮助您编译错误。如果你想要if(x!= null){/ 使用它 /}

之类的逻辑,则只设置为null

答案 3 :(得分:3)

必须在使用之前将局部变量分配给某些东西。

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,对于基元类似于零)。局部变量不会被隐式初始化。

答案 4 :(得分:1)

没有任何差异可以预期一件事,如果你没有初始化它,稍后你试图使用这个变量(不改变引用)意味着在编译时出错,但是如果你初始化它并且你使用它稍后(不更改引用)表示NullPointerException。

我给你看一个例子。

不初始化

Integer y;
y.intValue(); // Compilation error

初始化

Integer x = null;
x.intValue(); // You are able to compile it but NullPointerException

答案 5 :(得分:1)

内部没有区别。这也是一个值得商榷的话题。

仅在确实需要时才使用局部变量。局部变量主要在以下场景中(我可能会缺少其他几个)。

作为简写或可读性

Integer myObject = someObject.someFunction().someOtherFunction();

如果我们在很多地方使用这样的语法,代码就会变得笨拙。

用于辅助功能

Object returnObject = null;    
if(mycondition)
{
    returnObject = value1;
}
else if(secondCondition)
{
    returnObject = value2;
}

return returnObject;

上述代码段的调用者将根据返回值做出决定。 老实说,我没有看到其他有效的用例来声明没有初始值的变量。

结论(最佳实践):

  • 仅在需要时声明局部变量
  • 始终使用默认值创建局部变量。