为什么"变量可能尚未初始化"防止编译?

时间:2016-02-05 01:21:00

标签: java

#define COMMA_IF_PARENS(...) ,
#define LPAREN (
#define EXPAND(...) __VA_ARGS__
#define CHOOSE(...) \
    EXPAND(LOG LPAREN \
      __VA_ARGS__ COMMA_IF_PARENS __VA_ARGS__ COMMA_IF_PARENS __VA_ARGS__ (), \
      LOG2, impossible, LOG2, LOG1, LOG0, LOG1, ))
#define LOG(a0, a1, a2, a3, a4, a5, arg, ...) arg

即使myObj a; int b = 1; int c = 1; if(b == c) { a = new myObj(5); b = 2; } if(a.getValue() == 5) { .... } 在到达第二个if语句时总是被初始化,我仍然无法编译程序,除非我在开​​始时声明它。

此外,如果我添加a工作,这与我刚将其保留为myObj a = null基本相同,但不是给出错误或阻止编译。

为什么"变量可能尚未初始化"一个阻止编译的错误,而不仅仅是一个警告? myObjmyObj a;之间有什么区别?

1 个答案:

答案 0 :(得分:3)

  

为什么"变量可能尚未初始化"一个阻止编译的错误,而不仅仅是一个警告?

因为警告往往被忽略,Java设计者也知道。这是一个相对容易捕获的简单修复,因此错误输出的成本为零。

  

" myObj a;"有什么区别?和" myObj a = null;"?

第二个声明说"我考虑了初始值,它将为空。"

第一个声明说"我还没有决定初始价值;也许以后。"

你的情况很有意思,因为值总是要设置,只是编译器不够聪明才能看到它。