日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

AndroidJava try-catch-finally正确用法

發布時間:2025/3/12 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AndroidJava try-catch-finally正确用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、try-catch-finally的用途
  • 二、try-catch的正確使用
  • 三、奇怪的try-finally (錯誤的用法)
  • 四、關于try-catch-finally的面試考察
    • 1、try、catch、finally 考察,請指出下面程序的運行結果。
    • 2、try、catch、finally 考察2,請指出下面程序的運行結果。
    • 3、try、catch、finally 考察3,請指出下面程序的運行結果。

一、try-catch-finally的用途

1、異常捕獲;
2、同步鎖的應用。

try用于存放要核心代碼,catch捕獲核心代碼發生的異常,finally用于存放那些無論是否出現異常都一定會執行的代碼。在實際使用中,通常用于釋放鎖、數據庫連接等資源,把資源釋放方法放到 finally 中,可以大大降低程序出錯的幾率

二、try-catch的正確使用

try{// 核心代碼,如果讀取數據庫內容 }catch(Exception e){//異常捕獲,例如輸出異常信息}finally{//善后處理,無論是否異常,都會執行的部分 }

三、奇怪的try-finally (錯誤的用法)

從代碼上看是為了保證鎖的釋放

public void updateChatMsgReadFlag(long time) {mLock.writeLock().lock();try {if (dataBaseManager != null) {dataBaseManager.updateRtChatMsgReadFlag(time);}} finally {mLock.writeLock().unlock();} } try {String sTableName = getChatTableName(mDatabase);String sql = "select * from " + sTableName + " where ("+ ChatColumns.CHAT_RECEIVEUSERID + "=?" + " or "+ ChatColumns.CHAT_SENDUSERID + "=?)" + " and "+ ChatColumns.CHAT_TIME + "<?" + " order by "+ ChatColumns.CHAT_TIME + " desc limit ?";cursor = mDatabase.rawQuery(sql, new String[] { ownerId + "",ownerId + "", timeMillions + "", limit + "" });for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {AbsChatMessage entity = dataToObject(cursor);msgList.add(entity);} } finally {if (cursor != null) {cursor.close();} }

從代碼看是保證數據庫的cursor得到有效的關閉。

在項目中看到的代碼,也不知道小伙伴是怎么想的,就把catch給丟掉,咋一看用了try沒有問題,但實際運行中卻異常了,異常是自然的,這種坑多數情況下要分析堆棧并結合代碼能找出問題,其次利用工具進行codereview,再就是仔細的人工codereview能發現。

四、關于try-catch-finally的面試考察

1、try、catch、finally 考察,請指出下面程序的運行結果。

public class TryDemo {public static void main(String[] args) {System.out.println(foo());}public static int foo() {try {return 1;} catch (Exception e) {return 2;} finally {System.out.print("3");}} }

執行結果:31。

相信很多同學應該都做對了,try、catch。finally 的基礎用法,在 return 前會先執行 finally 語句塊,所以是先輸出 finally 里的 3,再輸出 return 的 1。

2、try、catch、finally 考察2,請指出下面程序的運行結果。

public class TryDemo {public static void main(String[] args) {System.out.println(foo1());}public static int foo1() {try {return 2;} catch (Exception e) {return 1;} finally {return 3;}} }

執行結果:3。

這題有點顯難,但也不難,try 返回前先執行 finally,結果 finally 里不按套路出牌,直接 return 了,自然也就走不到 try 里面的 return 了。

finally 里面使用 return 僅存在于面試題中,實際開發中千萬不要這么用。

3、try、catch、finally 考察3,請指出下面程序的運行結果。

public class TryDemo {public static void main(String[] args) {System.out.println(test1());}public static int test1() {int i = 0;try {i = 2;return i;} catch (Exception e) {return 1;} finally {i = 3;}} }

執行結果:2。

這邊估計有不少同學會以為結果應該是 3,因為我們知道在 return 前會執行 finally,而 i 在 finally 中被修改為 3 了,那最終返回 i 不是應該為 3 嗎?確實很容易這么想,我最初也是這么想的,當初的自己還是太年輕了啊。

這邊的根本原因是,在執行 finally 之前,JVM 會先將 i 的結果暫存起來,然后 finally 執行完畢后,會返回之前暫存的結果,而不是返回 i,所以即使這邊 i 已經被修改為 3,最終返回的還是之前暫存起來的結果 2。

這邊其實根據字節碼可以很容易看出來,在進入 finally 之前,JVM 會使用 iload、istore 兩個指令,將結果暫存,在最終返回時在通過 iload、ireturn 指令返回暫存的結果。

面試考察部分來自
https://blog.csdn.net/v123411739/article/details/115364158

總結

以上是生活随笔為你收集整理的AndroidJava try-catch-finally正确用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。