В отличие от вас, компилятор не может (или, скорее, не пытается определить), что цикл выполняется хотя бы один раз.
Конкретные правила вокруг этого приведены в 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;
}
}
Компилятор может определить, что ваш исходный цикл никогда не завершался нормально, учитывая гораздо более сложные правила достижимости, но практические случаи использования этого настолько малы, что это не оправдывает сложности.