За последние два дня я узнал о механизме исключений, из которого, по моему мнению, try...catch...finally является важной частью. Что касается утверждений, которые я узнал ранее, я столкнулся с интересной проблемой возврата и наконец. После экспериментов я обнаружил, что в компьютерном языке эта логическая связь действительно тонкая. Это мое собственное мнение. Если что-то не так, я надеюсь, что вы, пожилые люди, сможете это указать:
Сначала посмотрим на первый фрагмент кода
общественный класс return_finally { public static void main(String[] args) { System.out.println( m_1() } public static int m_1() { int i=10; try { System.out.println( "start"); ); return i+=10; }catch(Exception e){ System.out.println("ошибка: "+e }finally{ if(i>10){ System.out.println(я); } System.out.println("наконец" } вернуть я; } }
Вывод первого фрагмента кода выглядит следующим образом:
начинать
20
окончательно
20
Обратите внимание, что второй возврат в настоящее время находится за пределами оператораfinally. Согласно правилам, которые return иfinal появляются одновременно, мы можем понять, что первый return — это просто условие. Его функция — только найти операторfinally. Фактически, он выполняет только операцию i+= 10, затем напрямую вводит операторfinally и, наконец, возвращает результат.
Давайте посмотрим на второй фрагмент кода:
общественный класс return_finally { public static void main(String[] args) { System.out.println( m_1() } public static int m_1() { int i=10; try { System.out.println( "start"); ); return i+=10; }catch(Exception e){ System.out.println("ошибка: "+e }finally{ if(i>10){ System.out.println(i); } System.out.println("наконец"); вернуть 50; } }
Разница между вторым фрагментом кода и первым заключается в том, что окончательный возврат помещается в операторfinally. Мы можем угадать результат вывода:
начинать
20
окончательно
50
Выполненный в этот момент возврат перезаписал 20, полученный из результата предыдущей операции, и вернул значение 50, что означает, что возврат в операторе Final был выполнен. Ну, это следует сказать так~~.
Существует также третий фрагмент кода, пожалуйста, наслаждайтесь им медленно:
общественный класс return_finally { public static void main(String[] args) { System.out.println( m_1() } public static int m_1() { int i=10; try { System.out.println( "start"); ); return i; }catch(Exception e){ System.out.println("ошибка: "+e }finally{ if(i>10){ System.out.println(я); } System.out.println("наконец"); я = 50; вернуть я;
На данный момент в оператореfinally есть лишний i=50, и каков результат?
начинать
окончательно
10
Вот результат. В оператореfinally нет оператора return, поэтому исходное возвращаемое значение не изменится.
Итак, с помощью этих трех примеров, можем ли мы понять это следующим образом:
При обнаружении возврата в операторе try сначала сохраните значение в каком-либо месте, а затем найдите операторfinally в операторе, извлеките значение из этого места и выполните вычисление, если оно есть. наконец, возврат, просто поместите «новое значение» «Перезапишите «старое значение» в этом пространстве и в конечном итоге вернитесь; если наконец возврата нет, просто удалите «старое значение» в этом пространстве и верните его.
Вышеизложенное предназначено исключительно для понимания, надеюсь, вы дадите мне больше советов, спасибо за помощь!