我正在使用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
不再被调用。但是为什么编译器输出不同的东西呢?
感谢您的帮助!
亲切的问候
PPS:如果我通过System.out.println(..)
编译此文件,我不会收到任何警告,但我必须使用javac Test.java
(javac documentation)手动禁用它们,但我不这样做:
答案 0 :(得分:2)
编译器的主要任务之一是检查有效语法
最后一个方法有编译错误,因为在retrun
语句之后没有其他语句可能。
并且编译了previuos方法,因为即使存在明显的死代码警告,语法也是正确的。
所以尝试其他方式。
答案 1 :(得分:1)
它只是因为在前2中没有任何条件,运行时条件不会改变(就编译器而言),而在最后2条中,条件在运行时无法改变。
奇怪的是,将final
放在那里并没有帮助编译器实现死代码,尽管可以保证b永远不会改变。
似乎编译器没有做任何努力来评估你的代码在任何级别找到死代码......
答案 2 :(得分:1)
代码分析对"停止问题"非常敏感。一般来说。要获得有关代码的一些信息,通常必须运行代码(如果代码包含无限循环,分析器将在分析期间挂起)。由于这个问题,在foo和foo2代码分析器中并没有预测未来的代码行为。
foo4:这只是Java语法错误。在return语句之后不允许编写代码。
foo3:代码在语法上是正确的,但正如RC所提到的,与IDE集成的代码分析器能够执行一个永远不会被触发的分支的简单检测。