Почему условия не могут быть добавлены во внешний цикл - PullRequest
0 голосов
/ 31 мая 2018

Вот мое демо, оно очень простое, но я не могу добавить дополнение к внешнему циклу. i<10 Если я попытаюсь добавить, оно напомнило мне:

Этот метод должен вернутьрезультат типа String

public String testFor() {
    for(int i = 0; ; i++) {
        for(int j = 0; j < 10; j++) {
             return "success";
        }
    }
}

почему это происходит?

Ответы [ 5 ]

0 голосов
/ 31 мая 2018

Внутренний цикл и оператор return здесь не имеют большого значения.

Следующий фрагмент будет скомпилирован без присутствия оператора return:

public String testFor() {
    for (int i = 0; ;i++) {
    }
}

Theповедение указано в спецификации языка Java ( JLS §8.4.7 ):

Если объявлен метод с возвращаемым типом ( §8.4.5 ), тогда возникает ошибка времени компиляции, если тело метода может завершиться нормально ( §14.1 ).

В этом случае тело метода не можетзавершается нормально из-за бесконечного цикла, поэтому оператор возврата (или другое ненормальное завершение, например, throw SomeException()) не требуется.

0 голосов
/ 31 мая 2018

Соответствующие разделы JLS: Сек. 8.4.7 Тело метода ;соответствующая часть этого:

Если объявлен метод с возвращаемым типом (§8.4.5), то возникает ошибка времени компиляции, если тело метода может завершиться нормально (§14.1).

( «завершить как обычно» - это слегка запутанная терминология; в основном это означает выполнение без выполнения операторов return, throw или System.exit)

и Sec 14.21, Недоступные заявления .Соответствующая часть этого:

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

...

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

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

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

Внутренний цикл на самом деле не имеет отношения к поведению: вы увидите точно такое же поведение с:

public String testFor() {
  // Compiler error if you uncomment the condition.
  for(int i = 0; /* i<10 */; i++) { 
  }
}

Без условия ни одно из маркированных условий не выполняется, поэтому цикл не может завершиться нормально;как таковой, он не может достичь после цикла.Таким образом, оператор return (или throw или System.exit) не требуется.

Если добавить условие i<10, это не константа времени компиляции, поэтому цикл может завершиться нормально,Таким образом, вам нужно добавить оператор return (или throw или System.exit) после цикла.

0 голосов
/ 31 мая 2018

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

public String testFor() {
     for (int i = 0; i < 10; i++) {
         for (int j = 0; j < 10; j++) {
              return "success";
          }
     }
     return null;
}
0 голосов
/ 31 мая 2018

Редактировать: код просто выглядел по-другому, когда я отвечал ...

public String testFor()
{
    for (int i = 0;; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            return "success";
        }
    }
}

Этот код работает также.«j ++» - мертвый код, потому что мы вошли во внутренний цикл только один раз, прежде чем вернемся с «success».

0 голосов
/ 31 мая 2018

Ну, с:

for(int i = 0; ; i++) {
}

это на самом деле похоже на

int i = 0;
while (true) {
    ...
    i++
}

И поэтому компилятор знает, что это бесконечный цикл.

Однако,

for(int i = 0; i < 10; i++) {
}
// what to return here?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...