0

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

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 不允许执行代码,则会抱怨无法访问的语句?我认为最后的 return 语句是多余的,可能会让其他开发人员感到困惑,那么为什么 java 不让我摆脱它呢?

4

1 回答 1

8

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

它不是 JVM - 它是编译器。而且编译器不知道调用会做什么——它只知道语言规则。(特别是JLS 第 14.21 节,无法访问的语句。)

例如:

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

private static void alwaysThrow() {
    throw new RuntimeException();
}

对比

public int foo() {
    throw new RuntimeException();
    // Error: unreachable statement
    return 10;
}

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

这可以通过返回类型“从不”来“修复” - 表示“此方法永远不会正常返回 - 它要么挂起要么抛出异常”,但这根本不是语言的一部分(并且会有自己的复杂性)。如果您有兴趣,Eric Lippert 有几篇关于 C# 主题的博文(位置相似):第一部分第二部分

于 2014-01-24T15:26:35.090 回答