Java try catch finally 總結
題記:
網上看了很多try catch finally 的例子,發現並沒有一個總結的非常全的,將各種case都有寫的,所以在這裡總結下,不正確的還請指教!
問題1: finally 語句內一定會執行嗎?
不一定會執行:如下兩種情況
- finally 語句必須在try語句塊執行的情況下才會執行。
- 如果有System.exit()語句,終止了JVM,則不會執行。舉例:
public int testCas1() {
int i = 1;
if (i == 1) {
return 0;
}
try {
System.out.println("try block");// 不會執行
return i;
} finally {
System.out.println("finally block");
}
}
返回結果:0,finally 中內容不會列印。
問題2: finally 語句如果有return,會影響return結果嗎?
會影響,會return成finally 中要return的結果
public int test() {
int i = 1;
try {
System.out.println("try block " + i);
i = i / 0;
return i;
} catch (Exception e) {
System.out.println("catch block");
i = i +1;
return i;
}
finally {
i = i + 1;
System.out.println("finally block");
return i;
}
}
test 結果如下,分析:即使出現exception 也會執行到finally.
try block 1
catch block
finally block
return value of test(): 3
問題3: finally 語句沒有return,但是修改了要返回的值,會最終影響返回結果嗎?
- 如果return的資料是基本資料型別或文字字串,則在finally中對該基本資料的改變不起作用,try中的return語句依然會返回進入finally塊之前保留的值。
- 如果return的資料是引用資料型別,而在finally中對該引用資料型別的屬性值的改變起作用,try中的return語句返回的就是在finally中改變後的該屬性的值。
public int test() {
int i = 1;
try {
System.out.println("try block " + i);
i = i / 0;
return i;
} catch (Exception e) {
System.out.println("catch block");
i = i +1;
return i;
}
finally {
i = i + 1;
System.out.println("finally block");
}
}
結果, return 是2 不是3
try block 1
catch block
finally block
return value of test(): 2
引用型別:
public static Person test() {
Person result = new Person();
try {
result.age = 30;
return result;
} finally {
result.age = 50;
}
}
public static class Person{
public static int age;
}
結果:Person.age = 50;
如果沒有異常出現,而且finally語句中沒有return,則會執行try裡邊的return,並且,會將變數暫存起來(物件存的是引用的地址),再去執行finally中的語句,這時候,如果返回值是基本資料型別或者字串,則finally相當於更改副本,不會對暫存值有影響;但是,如果返回值是物件,則finally中的語句,仍會根據地址的副本,改變原物件的值。所以上邊的例子,返回值的age為50。
相信通過以上3個問題,應該比較能駕馭對finally的各種題目。
相關文章
- Java try catch finallyJava
- 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#
- 有return的情況下try catch finally的執行順序(最有說服力的總結)
- 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
- C# 關於Try/Catch對系統效能影響的總結C#
- 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#
- PHP 的異常處理之try和catch用法小結PHP
- JS 使用try catch捕獲異常JS