这是Java语言的代码片段:
public void name(){
int value = 9;
int o;
if(value > 9)
o = 5;
if(value <= 9)
o = 8;
System.out.println(o);
}考虑到值的最后一个选项,为什么编译器看不到第二个if语句?它不会编译。诚挚的问候
发布于 2012-10-17 22:29:37
除非您另有说明,否则编译器必须将value视为可更改的。将其声明为final fixes the problem
public void name(){
final int value = 9;
int o;
if(value > 9) o = 5;
if(value <= 9) o = 8;
System.out.println(o);
}发布于 2012-10-17 23:22:18
原始版本不能编译的原因是JLS section 16中的JLS的“确定赋值”规则说o没有被确定赋值。编译器用一条神秘的消息报告了这个问题,消息说"o可能还没有初始化“。
现在,任何具有简单演绎技能的人都可以看到,第二个if条件是第一个if条件的否定,因此变量实际上总是被初始化的。但是,JLS不允许编译器进行这种推断。JLS说这是个错误...
有很多方法可以解决这个问题。例如
在declaration.
o赋值两个if语句,并使用单个if / else else value作为final.最后一个修复很有趣。它工作的原因是JLS确定赋值规则要求编译器将编译时常量布尔值表达式的值考虑在内。
此语句(添加了final )
final int value = 9;意味着value是一个编译时常量。这意味着value <= 9和value > 9也是编译时常量。因此,JLS确定的赋值规则规定,o的赋值是在
if(value <= 9) o = 8;并且以后可以在没有编译错误的情况下使用。
明确的赋值规则旨在防止使用未初始化的变量,并防止空的final变量被多次初始化。
JLS对确定赋值规则中的表达式值的保守处理是为了避免出现这样的问题:一个Java编译器推断出某些东西是肯定赋值的,而另一个则不能。编译时间常量表达式的子例可以通过简单地计算表达式来处理,JLS规则隐式地识别这一点。
发布于 2012-10-17 22:29:10
在编译过程中:
编译器发现您还没有初始化变量'o‘,并且您正在打印sysout。
你可以做到这一点:
public void name(){
int value = 9;
int o;
if(value > 9)
o = 5;
else
o = 8;
System.out.println(o);
}https://stackoverflow.com/questions/12936542
复制相似问题