#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
基本相同,但不是给出错误或阻止编译。
为什么"变量可能尚未初始化"一个阻止编译的错误,而不仅仅是一个警告? myObj
和myObj a;
之间有什么区别?
答案 0 :(得分:3)
为什么"变量可能尚未初始化"一个阻止编译的错误,而不仅仅是一个警告?
因为警告往往被忽略,Java设计者也知道。这是一个相对容易捕获的简单修复,因此错误输出的成本为零。
" myObj a;"有什么区别?和" myObj a = null;"?
第二个声明说"我考虑了初始值,它将为空。"
第一个声明说"我还没有决定初始价值;也许以后。"
你的情况很有意思,因为值总是要设置,只是编译器不够聪明才能看到它。