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
是不可变的。这是我在阅读教程时遇到的一段代码,我相信解决方案是编译时常量,是的,我知道代码修复方法:)谢谢这是我在阅读教程时遇到的一段代码,我相信解决方案是编译时常量,是的,我知道代码修复了这一点:)谢谢这确实消除了我的疑虑。编译时常量是我主要寻找的东西。这确实澄清了我的疑问。编译时常量是我主要寻找的东西。