Выполнение операторов после блока try/catch, содержащего return

Есть три случая для рассмотрения:

Случай 1:

public class Test {

    public static void main(String[] args) {
                System.out.println(1);
                System.out.println(2);
                return;
                System.out.println(3);
    }
}

Случай 2:

public class Test {

    public static void main(String[] args) {

        try{
            System.out.println(1);
            return;
        }finally{
            System.out.println(2);
        }
        System.out.println(3);
    }
}

Случай 3:

public class Test {

    public static void main(String[] args) {
        try{
            System.out.println(1);
            return;
        }catch(Exception e){
            System.out.println(2);
        }
        System.out.println(3);
    }
}

Я понимаю, что в случае 1 заявление System.out.println(3) недоступен, поэтому это ошибка компилятора, но почему компилятор не отображает никаких ошибок в случае 3.

Также обратите внимание, что это даже ошибка компилятора в случае 2.

4 ответа

Решение

Случай 3:

Если возникает исключение, тогда весь ваш код доступен, и он печатает 1,2,3. По этой причине у вас нет ошибки (недоступный код).

Случай 2:

В этом случае независимо от того, чего вы не достигнете System.out.println(3)потому что ты всегда возвращаешься из main метод.

В случае 2 у вас есть пункт finally. Он выполняется после предложения try. Итак, порядок исполнения:

  1. System.out.println(1);
  2. вернуть;
  3. System.out.println(2);

И "System.out.println(3);" недоступен

Но в случае 3 у вас есть пункт cath. Он выполняется, если в предложении try есть Исключение. Таким образом, есть возможные пути (с ошибкой или без нее в "System.out.println(1);")

Сначала без ошибок:

  1. System.out.println(1);
  2. вернуть;

Второй с ошибкой:

  1. System.out.println(1); (Бросает Исключение)
  2. System.out.println(2); (Не выходит из кода путем возврата или выдачи нового исключения)
  3. System.out.println (3); (после попытки / улова)

PS: в случае 2, если у вас было исключение для System.out.println(1); он будет запускать System.out.println(2); перед тем, как продолжить генерировать исключение до трассировки стека...

В случае 3, если println(1) создает RuntimeException, println(2) выполняется, а затем println(3). Итак, println(3) достижимо.

в вашем случае 1 у вас есть недоступный код, потому что независимо от того, что произойдет, вы собираетесь вернуться из метода, но в случае 3 вы можете выполнить инструкцию System.out.println(3), если произойдет исключение

случай 3:

если вы собираетесь получить исключение в System.out.println(1), то в конечном итоге управление будет смещено в блок catch и выполнит System.out.println(2), а затем с нормальным потоком выполнит System.out.println(3)

Теперь остановимся на втором случае:

если вы не получите исключение в блоке try, он выполнит System.out.println(1), а затем System.out.println(3)

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

так что хорошей практикой является написание кода следующим образом

public class Test {

    public static void main(String[] args) {
        try{
            System.out.println(1);
            System.out.println(3);
        }catch(Exception e){
            System.out.println(2);
        }
    }
}

так что именно я имею в виду, что операторы, которые зависят от выполнения System.out.println(1), также должны быть внутри try после System.out.println(1), а операторы, которые зависят от кода внутри try, должны быть написаны за пределами попробовать

Другие вопросы по тегам