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的各種題目。
相關文章
- try-catch-finally的使用
- JavaScript try catch finally 語句JavaScript
- JavaScript try/catch/finally 語句JavaScript
- 【轉】java中異常與try catch finally詳解Java
- JAVA的異常處理機制(一)——try...catch...finallyJava
- [Java基礎]try-catch-finally 和 return 的執行順序Java
- Will it finally: 關於 try/catch 的一些細節
- Java趣味分享:try/finallyJava
- try-catch-finally,被你忽略掉的執行順序
- try ,catch
- (轉)有return的情況下try catch finally的執行順
- 有return的情況下try catch finally的執行順序
- Laravel try catchLaravel
- Java中try()catch{}的使用方法Java
- Java之異常處理try{}catch(){}Java
- java try(){}catch(){}自動資源釋放Java
- 謹慎 try-finally
- try/catch/finally:“前端的好厚米,我覺得你們不夠了解我呀~”前端
- Java之try-catch和throws的區別Java
- js中try和catch的用法JS
- (十四).try-throw-catch機制
- try/catch 的解釋與用法
- PHP 的異常處理之try和catch用法小結PHP
- IDEA 自動生成try,catch快捷鍵Idea
- JS 使用try catch捕獲異常JS
- c++中的try-catch及throwC++
- NodeJS 實戰系列:如何設計 try catchNodeJS
- try throw catch 語句檢測input值
- python 中 try...finally... 的優雅實現Python
- JavaScript 中 try...catch 的 10 個使用技巧JavaScript
- 在 SQL Server 中使用 Try Catch 處理異常SQLServer
- Sqlserver Try Catch時Catch捕獲到錯誤則重試一次的寫法SQLServer
- 無需寫try/catch,也能正常處理異常
- 異常-try...catch的方式處理異常1
- 異常-try...catch的方式處理異常2
- 【搞定面試官】try中有return,finally還會執行嗎?面試
- 實現 Promise.resolve/reject/all/race 及例項方法 .catch/.finallyPromise
- [Java基礎]FinallyJava