tryについて、finallyの実行順の面接問題
try{}の中にreturn文がありますが、このtryの後に続くfinally{}のコードは実行されますか?いつ実行されますか?
運転結果は
2
aa
1
なぜですか?メイン関数がサブ関数を呼び出し、結果を得るプロセスは、メイン関数が空き缶を用意して、サブ関数が結果を返すときは、まず結果を缶に入れてから、プログラム論理をメイン関数に戻します。リターンとは、サブ関数のことです。私はもう動かないので、あなたのメイン関数は続けて運転してください。これは何の結果もないです。結局、この話をする前に缶に入れたのです。
public class small T
{
public static void main(String args[])
{
smaltlt = new smaallT();
要点 b = t.get()
System.out.println(b);
}
public int get()
{
try
{
return 1;
}
finally
{
return 2;
}
}
)
返した結果は2です。
この答えは次の例の手順で説明してもらえます。tryの中のreturn文で呼び出された関数はfinallyで呼び出された関数より先に実行され、つまりreturn文は先に実行され、finally文は後で実行されるので、戻りの結果は2です。Returnは関数をすぐに返すのではなく、return文が実行された後、戻り結果を関数スタックに入れます。この時、関数はすぐに戻るのではなく、finally文を実行してから戻ってきます。
答えを説明する時は、次の手順で分析を助けることができます。
public class Test{
/**
* @param args add by zxx,Dec 9,2008
*/
public static void main(String[]args){
// TODO Auto-generated methodb stub
System.out.println(new Test().test();
}
int test()
{
try
{
return func 1()
}
finally
{
return func 2()
}
}
int func 1()
{
System.out.println(「Fnc 1」)
return 1;
}
int func 2()
{
System.out.println(「Fnc 2」)
return 2;
}
)
---------実行結果---------------------
func 1
func 2
2
結論:finallyのコードはreturnとbreak文より後に実行されます。
- public class test {
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- System.out.println(new test().test());;
- }
-
- static int test()
- {
- int x = 1;
- try
- {
- return x;
- }
- finally
- {
- ++x;
- System.out.println(x);
- System.out.println("aaa");
- }
- }
-
- }
運転結果は
2
aa
1
なぜですか?メイン関数がサブ関数を呼び出し、結果を得るプロセスは、メイン関数が空き缶を用意して、サブ関数が結果を返すときは、まず結果を缶に入れてから、プログラム論理をメイン関数に戻します。リターンとは、サブ関数のことです。私はもう動かないので、あなたのメイン関数は続けて運転してください。これは何の結果もないです。結局、この話をする前に缶に入れたのです。
public class small T
{
public static void main(String args[])
{
smaltlt = new smaallT();
要点 b = t.get()
System.out.println(b);
}
public int get()
{
try
{
return 1;
}
finally
{
return 2;
}
}
)
返した結果は2です。
この答えは次の例の手順で説明してもらえます。tryの中のreturn文で呼び出された関数はfinallyで呼び出された関数より先に実行され、つまりreturn文は先に実行され、finally文は後で実行されるので、戻りの結果は2です。Returnは関数をすぐに返すのではなく、return文が実行された後、戻り結果を関数スタックに入れます。この時、関数はすぐに戻るのではなく、finally文を実行してから戻ってきます。
答えを説明する時は、次の手順で分析を助けることができます。
public class Test{
/**
* @param args add by zxx,Dec 9,2008
*/
public static void main(String[]args){
// TODO Auto-generated methodb stub
System.out.println(new Test().test();
}
int test()
{
try
{
return func 1()
}
finally
{
return func 2()
}
}
int func 1()
{
System.out.println(「Fnc 1」)
return 1;
}
int func 2()
{
System.out.println(「Fnc 2」)
return 2;
}
)
---------実行結果---------------------
func 1
func 2
2
結論:finallyのコードはreturnとbreak文より後に実行されます。