Java编译器 - 几种方法,相同的行为,不同的输出

时间:2016-05-09 15:30:27

标签: java javac

我正在使用Java和return的{​​{1}}语句进行一些处理。

在每个方法中,Eclipse IDE(Eclipse Mars 4.5.2,Java 7)中的编译器具有不同的输出。我已将警告/错误写为关于相关行的评论:

void-method

每种方法都有相同的行为。 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"); } 为true,并调用if-statement。最后return-statement不再被调用。但是为什么编译器输出不同的东西呢?

感谢您的帮助!

亲切的问候

P.S。:我的Eclipse看起来像这样: enter image description here

PPS:如果我通过System.out.println(..)编译此文件,我不会收到任何警告,但我必须使用javac Test.javajavac documentation)手动禁用它们,但我不这样做:

enter image description here

3 个答案:

答案 0 :(得分:2)

  

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

最后一个方法有编译错误,因为在retrun语句之后没有其他语句可能。

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

所以尝试其他方式。

答案 1 :(得分:1)

它只是因为在前2中没有任何条件,运行时条件不会改变(就编译器而言),而在最后2条中,条件在运行时无法改变。

奇怪的是,将final放在那里并没有帮助编译器实现死代码,尽管可以保证b永远不会改变。

似乎编译器没有做任何努力来评估你的代码在任何级别找到死代码......

答案 2 :(得分:1)

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

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

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