tryについて...catch...finallyのreturnの疑惑
5115 ワード
tryについて...catch...finallyのreturnはずっと面接の人気試験点です.以下のいくつかの状況に分けられます.
1、finally文があり、tryにreturnがあり、return(まだ実行されていない)に実行されると、finallyの内容が先に実行され、行tryのreturnが実行されます.
出力:
2、1に基づいて、finallyにもreturn文がある場合、tryコードブロックのreturnはブロックされ(実行されない)、すなわちtryでreturnに遭遇した場合、finallyの内容(finallyのreturn文を含む)が先に実行される.
出力:
問題:
この二つの状況はきっとみんなが把握しているに違いない.しかし、もう一つの状況は、私には理解できないところです.一般的に、finallyでデータの閉じる操作(ファイル、入出力ストリーム、データベースの閉じるなど)を行い、finallyで返す値を修正すると、最終的な結果に反応しますか?(上記の説明から分かるように、tryにreturnがある場合、すぐに実行されず、finallyの内容を先に実行してからreturnを実行します).
考えてみれば、「try」と「finally」のどちらが出力されますか?
出力:
try
確かにtryしか出力されませんが、finallyではresultの値を変更しましたか?さらに改善してfinallyの付与文が実行されるかどうかを判断する
出力:
出力結果からfinallyの付与文は実行されていることがわかりますが、return結果ではどうして変わらないのでしょうか.(今のところしばらくここまで研究していますが、まだ分かりません.皆さんのご指導をお願いします)
1、finally文があり、tryにreturnがあり、return(まだ実行されていない)に実行されると、finallyの内容が先に実行され、行tryのreturnが実行されます.
package com.and.java.demo;
public class {
public static void main(String[] args) {
System.out.println(new ().test());
}
public String test() {
try {
System.out.println("try{...}");
return "try";
} catch (Exception e) {
System.out.println("catch{...}");
return "catch";
} finally {
System.out.println("finally{...}");
}
}
}
出力:
try{...}
finally{...}
try
2、1に基づいて、finallyにもreturn文がある場合、tryコードブロックのreturnはブロックされ(実行されない)、すなわちtryでreturnに遭遇した場合、finallyの内容(finallyのreturn文を含む)が先に実行される.
package com.and.java.demo;
public class {
public static void main(String[] args) {
System.out.println(new ().test());
}
public String test() {
try {
System.out.println("try{...}");
return "try";
} catch (Exception e) {
System.out.println("catch{...}");
return "catch";
} finally {
System.out.println("finally{...}");
return "finally";
}
}
}
出力:
try{...}
finally{...}
finally
問題:
この二つの状況はきっとみんなが把握しているに違いない.しかし、もう一つの状況は、私には理解できないところです.一般的に、finallyでデータの閉じる操作(ファイル、入出力ストリーム、データベースの閉じるなど)を行い、finallyで返す値を修正すると、最終的な結果に反応しますか?(上記の説明から分かるように、tryにreturnがある場合、すぐに実行されず、finallyの内容を先に実行してからreturnを実行します).
package com.and.java.demo;
public class {
public static void main(String[] args) {
System.out.println(new ().test());
}
public String test() {
String result = "";
try {
result = "try";
return result;
} catch (Exception e) {
result = "catch";
return result;
} finally {
result = "finally";
}
}
}
考えてみれば、「try」と「finally」のどちらが出力されますか?
出力:
try
確かにtryしか出力されませんが、finallyではresultの値を変更しましたか?さらに改善してfinallyの付与文が実行されるかどうかを判断する
package com.and.java.demo;
public class {
public static void main(String[] args) {
System.out.println(new ().test());
}
public String test() {
String result = "";
try {
result = "try";
return result;
} catch (Exception e) {
result = "catch";
return result;
} finally {
System.out.println("t1->"+result);
result = "finally";
System.out.println("t2->"+result);
}
}
}
出力:
t1->try
t2->finally
try
出力結果からfinallyの付与文は実行されていることがわかりますが、return結果ではどうして変わらないのでしょうか.(今のところしばらくここまで研究していますが、まだ分かりません.皆さんのご指導をお願いします)