Java 变量的定赋值
这是指编译器检查局部变量Java 变量的定赋值,java,if-statement,java-8,initialization,Java,If Statement,Java 8,Initialization,这是指编译器检查局部变量k的初始值设定错误的变量的确定赋值 void flow(boolean flag) { int k; if (flag) k = 3; if (!flag) k = 4; System.out.println(k); } 这段代码引发编译错误: k需要初始化 在下面的场景中,无论标志变量的值是什么,都将分配k变量的值。这里的编译错误是否合理?是的,变量k将被初始化,而不管其状态如何。但是,由于两个if条件
k
的初始值设定错误的变量的确定赋值
void flow(boolean flag) {
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
这段代码引发编译错误:
k
需要初始化
在下面的场景中,无论
标志
变量的值是什么,都将分配k
变量的值。这里的编译错误是否合理?是的,变量k
将被初始化,而不管其状态如何。但是,由于两个if
条件彼此不相关,因此编译器无法保证变量k
在控件到达println
方法调用时已初始化
我假设您知道当前问题的解决方法,但如果不是这样,您只需要删除第二个
if
语句,然后将else
块链接到第一个if
语句。是的,变量k
将被初始化,而不管其状态如何。但是,由于两个if
条件彼此不相关,因此编译器无法保证变量k
在控件到达println
方法调用时已初始化
我假设您知道当前问题的解决方法,但如果不是这样,您只需要删除第二个
if
语句,然后将else
块链接到第一个if
语句上。这是因为编译器没有检查非最终字段的所有可能值(flag
此处)
编译器只能分析编译时常量,并确认是否初始化局部变量
Java语言规范中有更多关于此的内容:
考虑同一方法的另外两种变体
在这里,即使编译器知道flag的值,也会为变量k抛出编译器错误
void flow() {
boolean flag = false;
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
这里,由于flag是编译时常量,编译器可以计算变量k的值,因此不会出现编译错误
void flow() {
final boolean flag = false;
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
这是因为编译器不会检查所有非最终字段的可能值(
flag
)
编译器只能分析编译时常量,并确认是否初始化局部变量
Java语言规范中有更多关于此的内容:
考虑同一方法的另外两种变体
在这里,即使编译器知道flag的值,也会为变量k抛出编译器错误
void flow() {
boolean flag = false;
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
这里,由于flag是编译时常量,编译器可以计算变量k的值,因此不会出现编译错误
void flow() {
final boolean flag = false;
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
如果不使用
else
,编译器就不会聪明到知道您已经检查了两个标志条件。使用else
。更好的问题是,这段代码是否正确?为什么要显式检查布尔值的两侧?更好的版本应该是:final int k=flag?3:4;
一行而不是五行,最好是一行理解并作为一个加号,变量k
是不可变的。如果不使用else
,编译器不太聪明,不知道您已经检查了这两个标志条件。使用else
。更好的问题是,这段代码正确吗?为什么要显式检查布尔值的两侧?更好的版本应该是:finalint k=flag?3:4;
一行而不是五行,更容易理解,加上变量k
是不可变的。这是我在阅读教程时遇到的一段代码,我相信解决方案是编译时常量,是的,我知道代码修复方法:)谢谢这是我在阅读教程时遇到的一段代码,我相信解决方案是编译时常量,是的,我知道代码修复了这一点:)谢谢这确实消除了我的疑虑。编译时常量是我主要寻找的东西。这确实澄清了我的疑问。编译时常量是我主要寻找的东西。