Java try catch finally
參考:
https://www.ibm.com/developerworks/cn/java/j-lo-finally/
http://www.cnblogs.com/lanxuezaipiao/p/3440471.html
finally 語句塊一定會執行嗎?
有兩個前提條件
1.try塊已經得到執行
2.不能出現Error.比如關停了JVM
finally塊執行的時機
try或者catch return的語句執行時候,但是在實際return之前,執行finally
如果try或者catch中有返回,finally塊的定位
相當於在try或者catch中呼叫了一個函式.和普通函式呼叫中傳值,傳址那套.一樣一樣的.
如果finally中有return,會直接覆蓋try或者catch中的return
開始舉栗子:
1.finally語句在return語句執行之後return返回之前執行的。
結果:
try block
finally block
b>25, b = 100
100
說明try塊中的b+=80 已經執行完畢,才進入finally塊.
2.finally塊中的return語句會覆蓋try塊中的return返回。
try block
finally block
b>25, b = 100
200
也就是說如果finally中有return語句,會覆蓋原來try或者catch中的return語句.
3.如果finally語句中沒有return語句覆蓋返回值,那麼原來的返回值可能因為finally裡的修改而改變也可能不變。
就是原來傳值,傳址那一套...
所謂傳值的..
結果:
try block
finally block
b>25, b = 100
100
傳址的
FINALLY
傳值傳址本身就是一個不嚴謹的說法.
剛才傳值的情況,如果將int改為Integer
try block
finally block
b>25, b = 100
100
給我的感覺,finally和以下的程式碼差不多
所以除非透過 指標b,修改原來物件的實際內容.
否則,修改 指標b指向別的物件,或者將指標b設定為null.都不能影響原來函式的返回值.
4.try塊裡的return語句在異常的情況下不會被執行。
由於程式碼11行發生異常,直接進入catch,finally處理.最終在24行返回.
注意這個時候,catch和finally塊對b的修改,都可以反映在最終的結果中.
結果:
try block
catch block
finally block
b>25, b = 35
85
5.當發生異常後,catch中的return執行情況與未發生異常時try中return的執行情況完全一樣。
結果:
try block
catch block
finally block
b>25, b = 35
35
程式媛的總結:
最後總結:finally塊的語句在try或catch中的return語句執行之後返回之前執行且finally裡的修改語句可能影響也可能不影響try或catch中 return已經確定的返回值
若finally裡也有return語句則覆蓋try或catch中的return語句直接返回。
我覺得吧...finally就別寫return了.
https://www.ibm.com/developerworks/cn/java/j-lo-finally/
http://www.cnblogs.com/lanxuezaipiao/p/3440471.html
finally 語句塊一定會執行嗎?
有兩個前提條件
1.try塊已經得到執行
2.不能出現Error.比如關停了JVM
finally塊執行的時機
try或者catch return的語句執行時候,但是在實際return之前,執行finally
如果try或者catch中有返回,finally塊的定位
相當於在try或者catch中呼叫了一個函式.和普通函式呼叫中傳值,傳址那套.一樣一樣的.
如果finally中有return,會直接覆蓋try或者catch中的return
開始舉栗子:
1.finally語句在return語句執行之後return返回之前執行的。
- public class T {
- public static void main(String[] args) {
- System.out.println(test1());
- }
- public static int test1() {
- int b = 20;
- try {
- System.out.println("try block");
- return b += 80;
- } catch (Exception e) {
- System.out.println("catch block");
- } finally {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- }
- return b;
- }
- }
結果:
try block
finally block
b>25, b = 100
100
2.finally塊中的return語句會覆蓋try塊中的return返回。
- public class T {
- public static void main(String[] args) {
- System.out.println(test2());
- }
- public static int test2() {
- int b = 20;
- try {
- System.out.println("try block");
- return b += 80;
- } catch (Exception e) {
- System.out.println("catch block");
- } finally {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- return 200;
- }
- // return b;
- }
- }
try block
finally block
b>25, b = 100
200
3.如果finally語句中沒有return語句覆蓋返回值,那麼原來的返回值可能因為finally裡的修改而改變也可能不變。
就是原來傳值,傳址那一套...
所謂傳值的..
- public class T {
- public static void main(String[] args) {
- System.out.println(test3());
- }
- public static int test3() {
- int b = 20;
- try {
- System.out.println("try block");
- return b += 80;
- } catch (Exception e) {
- System.out.println("catch block");
- } finally {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- b = 150;
- }
- //有異常才會執行如下返回
- return 2000;
- }
- }
結果:
try block
finally block
b>25, b = 100
100
- import java.util.HashMap;
- import java.util.Map;
- public class T {
- public static void main(String[] args) {
- System.out.println(getMap().get("KEY").toString());
- }
- public static Map getMap() {
- Map map = new HashMap();
- map.put("KEY", "INIT");
- try {
- map.put("KEY", "TRY");
- return map;
- } catch (Exception e) {
- map.put("KEY", "CATCH");
- } finally {
- map.put("KEY", "FINALLY");
- map = null;
- }
- return map;
- }
- }
FINALLY
剛才傳值的情況,如果將int改為Integer
- public class T {
- public static void main(String[] args) {
- System.out.println(test3());
- }
- public static Integer test3() {
- Integer b = new Integer(20);
- try {
- System.out.println("try block");
- return b += 80;
- } catch (Exception e) {
- System.out.println("catch block");
- } finally {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- b = new Integer(150);
- }
- return 2000;
- }
- }
try block
finally block
b>25, b = 100
100
給我的感覺,finally和以下的程式碼差不多
所以除非透過 指標b,修改原來物件的實際內容.
否則,修改 指標b指向別的物件,或者將指標b設定為null.都不能影響原來函式的返回值.
- public class T {
- public static void main(String[] args) {
- System.out.println(test3());
- }
- public static Integer test3() {
- Integer b = new Integer(20);
- System.out.println("try block");
- b += 80;
- funcFinally(b);
- return b;
- }
- private static void funcFinally(Integer b) {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- b = new Integer(150);
- }
- }
- public class T {
- public static void main(String[] args) {
- System.out.println(test4());
- }
- public static int test4() {
- int b = 20;
- try {
- System.out.println("try block");
- b = b / 0;
- System.out.println("墓誌銘:我覺得還能再搶救一下");
- return b += 80;
- } catch (Exception e) {
- b += 15;
- System.out.println("catch block");
- } finally {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- b += 50;
- }
- return b;
- }
- }
由於程式碼11行發生異常,直接進入catch,finally處理.最終在24行返回.
注意這個時候,catch和finally塊對b的修改,都可以反映在最終的結果中.
結果:
try block
catch block
finally block
b>25, b = 35
85
- public class T {
- public static void main(String[] args) {
- System.out.println(test5());
- }
- public static int test5() {
- int b = 20;
- try {
- System.out.println("try block");
- b = b / 0;
- return b += 80;
- } catch (Exception e) {
- System.out.println("catch block");
- return b += 15;
- } finally {
- System.out.println("finally block");
- if (b > 25) {
- System.out.println("b>25, b = " + b);
- }
- b += 50;
- }
- // return b;
- }
- }
結果:
try block
catch block
finally block
b>25, b = 35
35
程式媛的總結:
最後總結:finally塊的語句在try或catch中的return語句執行之後返回之前執行且finally裡的修改語句可能影響也可能不影響try或catch中 return已經確定的返回值
若finally裡也有return語句則覆蓋try或catch中的return語句直接返回。
我覺得吧...finally就別寫return了.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2101289/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java try catch finally 總結Java
- JavaScript try catch finally 語句JavaScript
- JavaScript try/catch/finally 語句JavaScript
- 【轉】java中異常與try catch finally詳解Java
- Java中的try、catch、finally塊簡單的解析Java
- Java含有return 的try catch finally的執行順序Java
- JAVA的異常處理機制(一)——try...catch...finallyJava
- 關於Java中try-catch-finally-return的執行順序Java
- [CareerCup] 14.2 Try-catch-finally Java中的異常處理Java
- [Java基礎]try-catch-finally 和 return 的執行順序Java
- Will it finally: 關於 try/catch 的一些細節
- c# 異常處理try catch finally_throwC#
- Java趣味分享:try/finallyJava
- try-catch-finally,被你忽略掉的執行順序
- C++異常處理:try,catch,throw,finally的用法C++
- c#之異常處理tcbs_try_catch_finallyC#
- java中try catch塊的使用Java
- Laravel try catchLaravel
- js try catchJS
- 有return的情況下try catch finally的執行順序
- (轉)有return的情況下try catch finally的執行順
- C++及Windows異常處理(try,catch; __try,__finally; __try, __except)——一道筆試題引起的探究C++Windows筆試
- Java之異常處理try{}catch(){}Java
- Java中try()catch{}的使用方法Java
- iOS的@try、@catch()iOS
- java try(){}catch(){}自動資源釋放Java
- Java之try-catch和throws的區別Java
- try/catch/finally:“前端的好厚米,我覺得你們不夠了解我呀~”前端
- c++ try catch 問題C++
- (十四).try-throw-catch機制
- js中try和catch的用法JS
- JavaScript錯誤_throw、try和catchJavaScript
- 微軟:請不要使用 Try/Catch微軟
- 【C#之Try……Catch例項】C#
- 有return的情況下try catch finally的執行順序(最有說服力的總結)
- JS 使用try catch捕獲異常JS
- try throw catch 語句檢測input值
- IDEA 自動生成try,catch快捷鍵Idea