首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器看不到的分支

编译器看不到的分支
EN

Stack Overflow用户
提问于 2012-10-17 22:24:26
回答 5查看 96关注 0票数 5

这是Java语言的代码片段:

代码语言:javascript
复制
 public void name(){
int value = 9;
 int o;
if(value > 9)
 o = 5;

if(value <= 9)
o = 8;

System.out.println(o);
}

考虑到值的最后一个选项,为什么编译器看不到第二个if语句?它不会编译。诚挚的问候

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-17 22:29:37

除非您另有说明,否则编译器必须将value视为可更改的。将其声明为final fixes the problem

代码语言:javascript
复制
public void name(){
    final int value = 9;
    int o;
    if(value > 9) o = 5;
    if(value <= 9) o = 8;
    System.out.println(o);
}
票数 5
EN

Stack Overflow用户

发布于 2012-10-17 23:22:18

原始版本不能编译的原因是JLS section 16中的JLS的“确定赋值”规则说o没有被确定赋值。编译器用一条神秘的消息报告了这个问题,消息说"o可能还没有初始化“。

现在,任何具有简单演绎技能的人都可以看到,第二个if条件是第一个if条件的否定,因此变量实际上总是被初始化的。但是,JLS不允许编译器进行这种推断。JLS说这是个错误...

有很多方法可以解决这个问题。例如

在declaration.

  • Replace中,

  • o赋值两个if语句,并使用单个if / else else value作为final.

最后一个修复很有趣。它工作的原因是JLS确定赋值规则要求编译器将编译时常量布尔值表达式的值考虑在内。

此语句(添加了final )

代码语言:javascript
复制
    final int value = 9;

意味着value是一个编译时常量。这意味着value <= 9value > 9也是编译时常量。因此,JLS确定的赋值规则规定,o的赋值是在

代码语言:javascript
复制
    if(value <= 9) o = 8;

并且以后可以在没有编译错误的情况下使用。

明确的赋值规则旨在防止使用未初始化的变量,并防止空的final变量被多次初始化。

JLS对确定赋值规则中的表达式值的保守处理是为了避免出现这样的问题:一个Java编译器推断出某些东西是肯定赋值的,而另一个则不能。编译时间常量表达式的子例可以通过简单地计算表达式来处理,JLS规则隐式地识别这一点。

票数 1
EN

Stack Overflow用户

发布于 2012-10-17 22:29:10

在编译过程中:

编译器发现您还没有初始化变量'o‘,并且您正在打印sysout。

你可以做到这一点:

代码语言:javascript
复制
public void name(){
int value = 9;
 int o;
if(value > 9)
 o = 5;

else
o = 8;

System.out.println(o);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12936542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档