为什么javac抱怨没有初始化变量?

Mar*_*eon 15 java initialization

对于这个Java代码:

String var;
clazz.doSomething(var);
Run Code Online (Sandbox Code Playgroud)

为什么编译器报告此错误:

变量'var'可能尚未初始化

我认为所有的变量或引用都被初始化为null.你为什么要做:

String var = null;
Run Code Online (Sandbox Code Playgroud)

??

Mic*_*ers 23

实例和类变量初始化为null(或0),但局部变量不是.

请参阅JLS的§4.12.5,以获得非常详细的解释,其中说的基本相同:

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

  • 在创建时,每个类变量,实例变量或数组组件都使用默认值进行初始化:
    • [剪掉所有默认值的列表]
  • 每个方法参数都初始化为方法的调用者提供的相应参数值.
  • 每个构造函数参数都初始化为由类实例创建表达式或显式构造函数调用提供的相应参数值.
  • 异常处理程序参数初始化为表示异常的抛出对象.
  • 必须在使用初始化或赋值之前,通过编译器使用明确赋值规则验证的方式,在使用本地变量之前显式赋予该值.

  • @Marcus @matt b:是的,可能是因为没有初始化局部变量几乎总是一个bug的标志. (3认同)

Bil*_*l K 7

这是因为Java非常有用(尽可能多).

它将使用相同的逻辑来捕捉您可能错过的一些非常有趣的边缘情况.例如:

int x;

if(cond2)
   x=2;
else if(cond3)
   x=3;

System.out.println("X was:"+x);
Run Code Online (Sandbox Code Playgroud)

这将失败,因为有一个未指定的else案例.事实是,这里应该绝对指定一个else case,即使它只是一个错误(默认情况下也是如此:switch语句中的条件).

有趣的是,你应该从中获取的是,在你弄清楚实际必须这样做之前,不要初始化你的局部变量.如果你习惯总是说"int x = 0;" 你会阻止这个梦幻般的"坏逻辑"探测器运行.这个错误为我节省了不止一次的时间.