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

2022-09-03 04:34:24

对于此 Java 代码:

String var;
clazz.doSomething(var);

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

变量“var”可能尚未初始化

我以为所有变量或引用都初始化为.为什么需要这样做:null

String var = null;

??


答案 1

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

请参阅JLS§4.12.5,了解非常详细的解释,其中基本上说了同样的事情:

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

  • 每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化:
    • [截取所有默认值的列表]
  • 每个方法参数都初始化为方法调用者提供的相应参数值。
  • 每个构造函数参数都初始化为类实例创建表达式或显式构造函数调用提供的相应参数值。
  • 异常处理程序参数初始化为表示异常的抛出对象。
  • 在使用局部变量之前,必须通过初始化或赋值,以编译器可以使用定赋值规则进行验证的方式显式为其赋值。

答案 2

这是因为Java非常有帮助(尽可能地)。

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

int x;

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

System.out.println("X was:"+x);

这将失败,因为存在未指定的其他情况。事实是,这里绝对应该指定其他情况,即使它只是一个错误(switch语句中的默认值也是如此:条件)。

有趣的是,你应该从中得到的是,在你弄清楚你实际上必须这样做之前,永远不要初始化你的局部变量。如果你习惯于总是说“int x=0”;你会阻止这个梦幻般的“坏逻辑”检测器运行。此错误多次为我节省了时间。