我有这个非常简单的代码片段:
static String getInput() throws IOException{
if(in.ready()){
return in.readLine().trim();
}
System.err.println("Please provide more input in order to execute the program.");
System.exit(0);
return "";
}
据我所知,JVM没有办法在代码末尾执行return语句。但如果我评论这一行,java会抱怨缺少return语句。为什么JVM不能识别System.exit(0)不允许执行任何其他代码,但如果返回不允许执行代码,则会抱怨无法访问的语句? 我认为最后的return语句是多余的,可能会让其他开发者感到困惑,为什么java不让我摆脱它呢?
答案 0 :(得分:8)
为什么JVM不能识别System.exit(0)不允许执行任何其他代码,但如果返回不允许执行代码,则会抱怨无法访问的语句?
这不是JVM - 它是编译器。并且编译器不知道库调用将会做什么 - 它只知道语言规则。 (特别是JLS section 14.21, Unreachable Statements。)
例如:
public int foo() {
alwaysThrow();
// This is required.
return 10;
}
private static void alwaysThrow() {
throw new RuntimeException();
}
VS
public int foo() {
throw new RuntimeException();
// Error: unreachable statement
return 10;
}
就编译器而言,简单的内联会改变代码的含义。
这可以通过返回类型“never”来“修复” - 表示“此方法永远不会正常返回 - 它会挂起或抛出异常”但这根本不是语言的一部分(并且会有自己的语言)并发症)。如果您有兴趣,Eric Lippert在C#上有关于此主题的几篇博客文章(处于类似位置):part one,part two。