Недоступный оператор возврата по-прежнему выдает ошибку
У меня есть очень простой фрагмент кода:
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# (который находится в аналогичной позиции): часть первая, часть вторая.