无法访问的返回语句仍然会抛出错误

jan*_*Dro 0 java jvm unreachable-code

我有这个非常简单的代码片段:

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 "";
}
Run Code Online (Sandbox Code Playgroud)

据我所知,JVM没有可能在代码末尾执行return语句.但如果我评论这一行,java会抱怨缺少return语句.为什么JVM不能识别System.exit(0)不允许执行任何其他代码,但如果返回不允许执行代码,则会抱怨无法访问的语句?我认为最后的return语句是多余的,可能会让其他开发者感到困惑,为什么java不让我摆脱它呢?

Jon*_*eet 8

为什么JVM不能识别System.exit(0)不允许执行任何其他代码,但如果返回不允许执行代码,则会抱怨无法访问的语句?

它不是JVM - 它是编译器.并且编译器不知道调用会做什么 - 它只知道语言规则.(特别是,JLS第14.21节,无法到达的声明.)

例如:

public int foo() {
    alwaysThrow();
    // This is required.
    return 10;
}

private static void alwaysThrow() {
    throw new RuntimeException();
}
Run Code Online (Sandbox Code Playgroud)

VS

public int foo() {
    throw new RuntimeException();
    // Error: unreachable statement
    return 10;
}
Run Code Online (Sandbox Code Playgroud)

就编译器而言,这种简单的内联会改变代码的含义.

这可以通过返回类型"never"来"修复" - 表示"此方法永远不会正常返回 - 它会挂起或抛出异常"但这根本不是语言的一部分(并且会有其自身的复杂性).如果您有兴趣,Eric Lippert在C#上有一些关于这个主题的博客文章(它处于类似的位置):第一部分,第二部分.