прервать заявление в конце концов Java - PullRequest
8 голосов
/ 02 июля 2011
  public class FinallyTest {
    static int i=0;
    public static void main(String a[]){
        while(true){
            try{
                i=i+1;
                return;
            }finally{
                i=i+1;
                break;
            }
        }
        System.out.println(i);
    }
}

В приведенном выше коде вывод «2». Я ожидал, что ничего не должно быть напечатано. Что именно здесь делает «перерыв»? Пожалуйста, объясни. Спасибо

Ответы [ 4 ]

10 голосов
/ 02 июля 2011

Предложение finally изменяет «причину завершения» предложения try.Для подробного объяснения см. JLS 14.20.2 - Выполнение try-catch-finally со ссылкой на JLS 14.1 Нормальное и внезапное завершение операторов .

Это один из тех странных крайних случаев в языке Java.Лучшей практикой не является намеренное изменение потока управления в предложении finally, поскольку читателю трудно понять его поведение.

Вот еще один патологический пример:

// DON'T DO THIS AT HOME kids
public int tricky() {
    try {
        return 1;
    } finally {
        return 2;
    }
}
5 голосов
/ 02 июля 2011

Код в предложении finally обязательно должен быть выполнен.

Вот поток:

Итак, после увеличения значения от i до 1 в блоке try он встречает оператор return.Но, он наконец-то тоже заблокировал .Таким образом, он выполняет блок finally и затем снова увеличивает значение от i до 2.Затем встречается разрыв и цикл завершается.

Итак, значение i = 2 в конце.Надеюсь, что поток чист.

4 голосов
/ 02 июля 2011

Это прерывает цикл и переопределяет возврат.

  1. finally блоки всегда выполняются
  2. то, что происходит в finally, может переопределить то, что произошло раньше -Брошенные исключения, операторы возврата.
0 голосов
/ 02 июля 2011
public static void main(String a[])
{
    while(true) <<< #1
    {
        try
        {
            i=i+1;  <<< #2
            return;
        }
        finally
        {
            i=i+1;  <<< #3
            break;  <<< #4
        }
    }
    System.out.println(i);  <<< #5
}

Это то, что показывает BlueJ Tracing.

...