为什么这个方法(测试)需要一个返回值(总是如此)?
public boolean test() { //This method must return a result of type boolean
if (true) {
return true; // always return true
}
}
当我添加返回值时,它会以 “死代码” 的形式发出警告。那么,为什么不接受第一个test()
方法
public boolean test(int i) {
if (true) {
return true;
} else { //Dead code
return false;
}
}
答案 0 :(得分:11)
方法返回分析不分析if
条件以查看它是否总是真或假,因为通常它不是编译时常量(否则你不会写if
1}}首先)。它只是看到有一个if
可以或不可以采取,如果没有采取,那么该方法不会返回一个值,因此错误。
死代码分析是在方法返回分析的单独传递中完成的,它进行了一些更深入的分析,查看分支条件。
我的完全不知情的猜测是这种行为是编译器如何开发的人工制品;方法返回分析是编译的重要部分,以确保最终获得有效的程序,因此是首先实现的核心功能之一。死代码分析是一个“很好”,所以后来使用更复杂的算法实现(因为核心编译器位在那个阶段完成)
答案 1 :(得分:2)
这是编译器进行深度分析的结果。
答案 2 :(得分:1)
这个方法什么都不做,所以是的,它是死代码。如果该方法始终返回true,则无需调用它,只需使用true
。
答案 3 :(得分:1)
在Java中,如果指定返回类型(布尔值),则必须显式指定该值,而不管它是否始终相同。这确实提出了一个问题:如果总是一样的话,为什么要归还什么呢?您已经知道调用代码中的答案。
为什么不写:
public boolean test() {
return true;
}
至于你问题的第二部分,编译器发现第二个路径从未在if语句中被采用,并且会给你一个警告。
答案 4 :(得分:0)
如果您测试某些内容,则可能是值或其他值。所以你不能保证会进入if语句。
if (someBoolean){
return true;
}
将无效,因为someBoolean可以是true或false。 如果你的方法必须返回一些东西而someBoolean为false,它将不会返回任何内容。 所以在这种情况下,您可以这样做:
if (someBoolean){
return true;
}
返回false;
或只是
return someBoolean;