2016-03-23 4 views
0

Учитывая приведенный ниже код, что именно возвращает здесь? Я имею в виду, какие методы и циклы делают выход программы из?Что именно возвращается в цикле?

void foo(){ 
    try{ 
     for (String a : myList){ 
      while(true){ 
       if (myBoolean) 
        return; 
      } 
     } 
    } catch (Exception e) { 
     } 
} 
+1

'return;' работает одинаково везде, кроме внутри лямбда. –

ответ

1

Когда myBoolean верно, завершает цикл, и все остальное, что происходит (без исключений для рассмотрения) и возвращает управление к тому, что функция называется foo().

В вашем использовании return; это относится к функциям, которые имеют тип возврата void. Поскольку ничего не вернуть, он просто останавливает все, что происходило в этой функции.

EDIT:

Одна вещь, чтобы отметить здесь, что ОП затронул try-catch блок. Если бы вместо этого существовал блок try-catch-finally или try-finally, он сначала ударил бы, что, наконец, блок перед возвратом. В приведенном ниже фрагменте , хотя оценивается return, печатается Hit finally. Попробуйте:

try { 
    if (0 == 0) 
     return; 
} finally { 
    System.out.println("Hit finally"); 
} 

Почему это происходит? Блок finally - это блокировка. Он ДОЛЖЕН ударить, чтобы предотвратить утечку ресурсов, которые произойдут, если управление будет разрешено покинуть синхронизированную область, не отпуская блокировку.

Aha. Есть способ обмануть это тоже. Посмотрите на этот бесконечный цикл.

while (true) { 
    try { 
     if (0 == 0) 
      return; 
    } finally { 
     continue; 
    } 
} 

Я думаю, этого достаточно для этого вопроса. Я сейчас остановлюсь.

+0

Мой главный вопрос: заканчивается ли это foo или нет. и я получил ответ. Благодарю. – solo

+0

@solo Да, босс. Конечно. :) –

+0

Я думаю, вы можете подумать о перерыве ;? «return» полностью выводит вас из метода. Java more-or-less никогда не имеет вложенных методов, поэтому там нет никакой двусмысленности. –

0

return выводит вас из метода, даже если метод возвращает void, вы вернетесь к исходному вызову при выполнении условия.

0

когда управление досягаемость к return заявление он вернется к вызывающем абоненте конца без каких-либо исключений (так что он не будет идти в catch блок),

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

0

return выходит метод foo.

Если вы хотите выйти из цикла while, используйте break (который вытаскивает вас из самой внутренней петли).

Если вы хотите, чтобы вырваться из петли for, используйте меченого перерыв:

label: 
for (String a : myList) { 
    ... 
    break label; 
+0

Спасибо. Я узнал что-то новое о ярлыке. – solo

+0

Нет проблем. Иногда это полезно, но не используйте его слишком сильно. –

0

Как и другие плакаты сказал, когда myBoolean верно, то return заявление вызовет метод foo() до конца, и чтобы вернуться к методу, который называется foo().

Чтобы развернуть ответ, break и continue также могут использоваться в цикле в зависимости от желаемого поведения. Оператор break вызовет завершение цикла, выполнение которого продолжается сразу после цикла.

Если вы хотите перейти к следующей итерации цикла, вы можете использовать continue.

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