Отсутствует оператор возврата внутри цикла for - PullRequest
5 голосов
/ 21 мая 2019

Я мог бы найти подобные вопросы к этому, но я не мог найти ответ, который я ожидаю в данном конкретном случае.

public int getIndex(){
    for(int x = 0; x < 5; x++) {
        return x;
    }
}

Когда я выполняю этот код, я получаю ошибку компиляции, говорящую "Missing return return". Но, насколько мне известно, очень ясно, что код в цикле for будет выполняться без каких-либо сомнений из-за первого раза, x = 0. Таким образом, в данном конкретном случае нет случая не выполнять код внутри цикла for. Итак, зачем нам также объявлять дополнительный оператор return вне цикла for?

Ответы [ 5 ]

10 голосов
/ 21 мая 2019

В отличие от вас, компилятор не может (или, скорее, не пытается определить), что цикл выполняется хотя бы один раз.

Конкретные правила вокруг этого приведены в JLS 14.21 . В частности:

Базовое выражение for может обычно завершаться, если хотя бы одно из следующих условий верно:

  • Оператор for достижим, есть выражение условия, и выражение условия не является константным выражением (§15.28) со значением true.

  • Существует оператор достижимого разрыва, который выходит из оператора for.

Содержащийся оператор достижим, если оператор for достижим, а выражение условия не является константным выражением со значением false.

У вас нет константного выражения условия, поэтому компилятор считает, что такой цикл for может нормально завершаться, поэтому операторы после него достижимы.

Это сработало бы без дополнительного оператора возврата, если бы i < 5 было постоянным выражением, таким как true.

public int getIndex(){
    for(int x = 0; true; x++) {
        return x;
    }
}

Компилятор может определить, что ваш исходный цикл никогда не завершался нормально, учитывая гораздо более сложные правила достижимости, но практические случаи использования этого настолько малы, что это не оправдывает сложности.

2 голосов
/ 21 мая 2019

Это потому, что JVM не имеет представления об условном разрыве, который вы будете использовать внутри цикла. Например:

public static int getIndex(){
  for(int x=0; x<5;x++){
    if(x<5) continue;
    return x;
  }
  return 6;
}

Здесь ясно, что без возврата вне цикла вы можете пропустить инструкцию возврата внутри цикла

1 голос
/ 21 мая 2019

в вашей функции

- этот метод должен возвращать результат типа int

генерация ошибок

BCZ

public static int getIndex(){
        for(int x = 0; x < 5; x++) {
            return x;
        }  
    }

не должен указывать возвращаемое значение вне функции Возврат по умолчанию

public static int getIndex(){
        for(int x = 0; x < 5; x++) {
            return x;
        }  
       return 0; <---------
    }
1 голос
/ 21 мая 2019

Я полагаю, что ваш пример ненастоящий, но вы можете изменить его на «пока» без ошибок компиляции:

public static int getIndex() {
    int x = 0;
    do {
        return x++;         
    } while (x < 5);
}
0 голосов
/ 21 мая 2019

Эти условия не понятны во время компиляции, тогда как во время выполнения они понимаются JVM. Но для компиляции кода требуется оператор return вне цикла for. Таким образом, чтобы скомпилировать код, вы должны иметь оператор return теоретически.

...