为什么编译器很高兴变量 g
在 if(true)
语句中初始化,而在 if(gg)
情况下提示 g
初始化,并抛出以下错误:
错误:(11, 28) java:变量 g 可能尚未初始化
public static void main(String args[]) {
boolean gg = true;
int g;
if (gg)
// if (true)
{
g = 6;
}
System.out.println(g);
}
最佳答案
true
是一个常量表达式,编译器可以在编译时扣除它的值。
另一方面,gg
不是常量,而是一个变量,您可以使用任何内容(甚至是表达式、函数的返回值等)对其进行初始化。因此,编译器不会检查您如何初始化该变量,而是假设它可以是任何东西。
这就是为什么编译器认为变量g
可以或不能初始化。
您认为编译器可以深入多深?以这个为例:
boolean gg = Math.random() >= 0.5;
gg = gg ? gg : true;
我们知道gg
为真,但是编译器如何知道它呢?
或者另一个例子:
boolean gg = (Math.random() >= 0.0);
同样,我们知道它始终为真(因为 random()
介于 0.0
和 1.0
之间),但编译器不知道。
因此,这对于编译器来说并不是一件容易的事,因此编译器创建者决定在预测执行流程时仅检查常量表达式,而不是猜测变量值。
这就是为什么您在一种情况下收到警告而在另一种情况下则没有的原因。
关于java - 局部变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58303604/