2016-05-09 58 views
1

我正在搞一点Java和void-methodreturn语句。Java编译器 - 几种方法,相同的行为,不同的输出

在每种方法中,我的Eclipse IDE(Eclipse Mars 4.5.2,Java 7)中的编译器具有不同的输出。我已经写过警告/错误作为对相关行的注释:

public static void foo() { 
     System.out.println("foo() - 1"); 
     boolean b = true; 
     if (b) 
      return; 
     System.out.println("foo() - 2"); 
    } 

    public static void foo2() { 
     System.out.println("foo2() - 1"); 
     // compiler warning: "The value of the local variable b is not used" 
     boolean b; 
     if (b = true) 
      return; 
     System.out.println("foo2() - 2"); 
    } 

    public static void foo3() { 
     System.out.println("foo3() - 1"); 
     if (true) { 
      return; 
     } 
     // compiler warning: "Dead code" 
     System.out.println("foo3() - 2"); 
    } 

    public static void foo4() { 
     System.out.println("foo4() - 1"); 
     return; 
     // compiler error: "Unreachable code" 
     System.out.println("foo4() - 2"); 
    } 

每种方法都有相同的行为。 if-statement为真,调用return-statement。最后的System.out.println(..)不再被调用。但为什么编译器输出不同的东西呢?

感谢您的帮助!

亲切的问候

PS:我的Eclipse看起来像这样: enter image description here

PPS:如果我通过javac Test.java编译这个文件我没有得到任何警告,但我不得不使用手动禁用它们-nowarnjavac documentation),但我没有这样做:

enter image description here

+1

因为代码是不同的。 – biziclop

+1

编译器足够聪明,可以诊断'if(true)'而不是其他情况 –

+0

发布字节码? – djechlin

回答

2

一个编译器的主要任务是检查有效的语法

末方法后retrun声明没有其他的说法可能是因为编译错误。

并且previuos方法被编译,因为即使存在明显的死代码警告,语法也是正确的。

所以试试吧。

1

仅仅是因为在前两个版本中没有garauntee条件在运行时不会改变(就编译器而言),而在最后2版本中,条件在运行时不会改变。

奇怪的是,把一个final没有帮助编译器实现死代码,尽管确保b永远不会改变。

看来,编译犯规做任何努力去评估你的代码在任何水平上寻找死代码...

1

代码分析是敏感的“停止问题”一般。要获取有关代码的一些信息,您通常必须运行代码(如果代码包含无限循环,分析器将在分析期间挂起)。由于这个问题,在foo和foo2中,代码分析器不能预测未来的代码行为。

foo4:这只是Java语法错误。返回语句后不允许编写代码。

foo3:代码在语法上是正确的,但是正如RC提到的那样,与IDE集成的代码分析器能够执行简单的检测,从不会触发分支。

相关问题