Выполнение операторов после блока 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. Итак, порядок исполнения:
- System.out.println(1);
- вернуть;
- System.out.println(2);
И "System.out.println(3);" недоступен
Но в случае 3 у вас есть пункт cath. Он выполняется, если в предложении try есть Исключение. Таким образом, есть возможные пути (с ошибкой или без нее в "System.out.println(1);")
Сначала без ошибок:
- System.out.println(1);
- вернуть;
Второй с ошибкой:
- System.out.println(1); (Бросает Исключение)
- System.out.println(2); (Не выходит из кода путем возврата или выдачи нового исключения)
- 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, должны быть написаны за пределами попробовать