Недоступный оператор возврата по-прежнему выдает ошибку

У меня есть очень простой фрагмент кода:

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 будет жаловаться на отсутствующее возвращаемое утверждение. Почему JVM не распознает, что System.exit(0) не позволит выполнить какой-либо другой код, но жалуется на недостижимые операторы, если возврат не позволит выполнить код? Я думаю, что оператор return в конце избыточен и может сбивать с толку других разработчиков, так почему же java не позволит мне от него избавиться?

1 ответ

Решение

Почему JVM не распознает, что System.exit(0) не позволит выполнить какой-либо другой код, но жалуется на недостижимые операторы, если возврат не позволит выполнить код?

Это не JVM - это компилятор. И компилятор не знает, что будут делать вызовы библиотеки - он знает только правила языка. (В частности, раздел 14.21 JLS, Недоступные заявления.)

Так, например:

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;
}

Это простое встраивание меняет смысл кода в том, что касается компилятора.

Это может быть "исправлено", если иметь возвращаемый тип "никогда" - чтобы указать "этот метод никогда не возвращается нормально - он либо вешает, либо выдает исключение", но это просто не является частью языка (и будет иметь свои собственные сложности). Если вам интересно, у Эрика Липперта есть пара постов в блоге на эту тему по C# (который находится в аналогичной позиции): часть первая, часть вторая.

Другие вопросы по тегам