2014-01-24 4 views
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 ""; 
} 

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

+0

System.exit (0); это всего лишь метод в отношении компилятора, и SecurityManager может помешать ему что-либо сделать. например, если вы вызываете его на сервере приложений, вы не хотите, чтобы он убивал все приложения. –

ответ

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

против

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

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

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

+0

Согласовано. Компилятор просто проверяет наличие возвращаемых значений на всех возможных путях выполнения. Он не «известен», что System.Exit (0) означает, что возврат «» не будет выполнен. Почему вы на самом деле делаете * такую ​​вещь (system.exit) - это тема для читателя. – robnick

+0

@jonSkeet благодарит за точный и быстрый ответ, примет как можно скорее! – janDro

+0

@robnick is System.exit плохой конвенции? Этот конкретный проект был для толпы, которая не слишком интересовалась трассировкой стека, поэтому я выбрал более короткие краткие сообщения об ошибках. – janDro

Смежные вопросы