私は過去 2 日間で例外メカニズムを学習しましたが、その中で try...catch...finally が重要な部分だと思います。以前に学習したステートメントに関連して、return とfinally という興味深い問題に遭遇しました。実験を行った結果、この論理関係は実に微妙であることがわかりました。以下は私個人の意見です。何か間違っている場合は、先輩方に指摘していただければ幸いです。
まず最初のコード部分を見てください
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ) } public static int m_1(){ int i=10; ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ); if(i>10); System.out.println( i ); System.out.println( "最終的に" ) } }
コードの最初の部分の出力は次のとおりです。
始める
20
ついに
20
この時点で 2 番目の return は、finally ステートメントの外側にあることに注意してください。return とfinally が同時に出現するという規則によれば、最初の return は、finally ステートメントを見つけるだけの機能であることがわかります。実際には、i+= 10 演算を実行し、その後、finally ステートメントに直接入力し、最後に結果を返すだけです。
2 番目のコードを見てみましょう。
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ) } public static int m_1(){ int i=10; ); return i+=10; }catch(Exception e){ System.out.println( "error: "+e ); if(i>10); System.out.println( i ); System.out.println( "最後に" ); } }
2 番目のコードと最初のコードの違いは、最終的な戻り値がfinally ステートメントに配置されていることです。出力結果は次のように推測できます。
始める
20
ついに
50
このとき実行されるreturnは、前回の演算結果から得られた20を上書きして値50を返しています。つまり、finally文のreturnが実行されています。まあ、こんな感じと言うべきですね~~。
3 番目のコードもありますので、ゆっくりお楽しみください。
public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ) } public static int m_1(){ int i=10; ); }catch(Exception e){ System.out.println( "エラー: "+e ); if(i>10); System.out.println( i ); System.out.println( "最終的に" ); i=50;
このとき、finally文にi=50が余分にあるのですが、結果はどうなるのでしょうか?
始める
ついに
10
これは結果です。finally ステートメントには return ステートメントがないため、元の戻り値は変わりません。
これら 3 つの例を通して、次のように理解できますか?
try ステートメントで return が発生した場合は、まず値を場所に保存し、ステートメント内に新しいアルゴリズムがある場合は、そのスペースから値を取り出して操作を実行します。 finally に return がある場合は、「新しい値」を入れるだけです。「そのスペースの「古い値」を上書きして最終的に戻ります。finally に return がない場合は、そのスペースにある「古い値」を取り出して返します。
上記は単に理解のためのものです。さらにアドバイスをいただければ幸いです。ご協力ありがとうございます。