Java 局部变量初始化null和不初始化之间的差异?

Java 局部变量初始化null和不初始化之间的差异?,java,Java,在Java中,区别是什么?最好的方法是什么 Integer x = null; // x later assign some value. Integer y; // y later initialize and use it. 没什么区别。在这两种情况下,当您想要使用它时,局部变量必须是初始化形式(必须有一个值) 从Javadoc 与对象在字段中存储状态的方式类似,方法将 通常将其临时状态存储在局部变量中。的语法 声明局部变量类似于声明字段(对于 例如,int count=0;)。没有特别的

在Java中,区别是什么?最好的方法是什么

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

没什么区别。在这两种情况下,当您想要使用它时,局部变量必须是初始化形式(必须有一个值)

Java
doc

与对象在字段中存储状态的方式类似,方法将 通常将其临时状态存储在局部变量中。的语法 声明局部变量类似于声明字段(对于 例如,int count=0;)。没有特别的关键字指定 变量为局部变量;这一决定完全来自于地理位置 在其中声明变量-介于开始和结束之间 方法的右括号。因此,局部变量仅可见 声明它们的方法;它们是不可接近的 从班上其他同学那里


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

对于类变量,没有区别,请参见:

。。。程序中的每个变量都必须有一个值,然后才能确定其值 使用:

对于所有引用类型(),默认值为
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
对于对象类型,类似于零对于原语)。局部变量不是隐式初始化的。

除了一件事之外,没有任何区别,如果您不初始化它并且以后尝试使用此变量(不更改引用),则表示编译时出错,但是如果您初始化它并且以后使用它(不更改引用)表示NullPointerException

我给你举个例子

不进行初始化

Integer y;
y.intValue(); // Compilation error
Integer x = null;
x.intValue(); // You are able to compile it but 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;
上述代码段的调用方将根据返回值做出决定。 老实说,我没有看到其他有效的用例来声明没有初始值的变量

结论(最佳做法):

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

不同之处在于编译器将阻止您读取未初始化的变量。这取决于您是否希望将其初始化为
null
,或者您是否希望确保在以后使用它之前必须对其进行初始化。这一点还不清楚。你说的是“变量”,你真的是指“变量”吗?实例成员的答案与实际变量的答案大不相同,有些人将其松散地称为“实例变量”。如果已将其设置为
null
,则可以将
x
作为
null
传递给方法,而无需重新分配它。如果你根本没有分配它,编译器在你分配之前不会让你使用它。@khelwood我最后说的是没有区别。