目录

  • 一、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正确用法相关推荐

  1. Lua C API 的正确用法

    Lua C API 的正确用法 转载于云风的博客 Lua 作为一门嵌入式语言,提供了完备的 C API 供 Lua 代码和宿主程序交互,当然,宿主语言最好是 C 或 C++ .如果是其它语言,比如最近 ...

  2. Spring MVC中Session的正确用法之我见02

    Spring MVC中Session的正确用法之我见 Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置 ...

  3. python中os.path.isdir()和os.path.isfile()的正确用法

    之前网上查找os.path.isdir()和os.path.isfile()的使用:发现很多是错误的,主要原因是,传入的参数不是绝对路径. 先介绍一下os.listdir()方法,此方法返回一个列表, ...

  4. C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod(Add);

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

  5. C#中dynamic、ExpandoObject 的正确用法

    原文地址:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynam ...

  6. try、catch、finally用法总结

    一.异常的处理:抓抛模型过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象.并将此对象抛出.一旦抛出对象以后,其后的代码就不再执行.关于 ...

  7. Java里try catch的简单用法

    Java里try catch的简单用法: Java里try catch的简单用法: 1.try+catch 程序的流程是:运行到try块中,如果有异常抛出,则转到catch块去处理.然后执行catch ...

  8. antd autoplay按f12才会轮播_涨知识了!原来这才是电脑键盘上,F1到F12的正确用法...

    在这个快节奏的时代,工作效率可以说是非常重要的,所以熟练掌握电脑就是提高效率的好方法!那如何快速的掌握电脑呢?这就不妨先了解下键盘上F1-F12的正确用法哦,每个都是提高效率的快捷键. F1:获取帮助 ...

  9. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  10. 改善C#程序的建议2:C#中dynamic的正确用法

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

最新文章

  1. 字符串-最后一个单词的长度(双指针)
  2. 解决 iOS 11 webview 顶部空白条的问题
  3. JavaSE基础知识(5)—面向对象(Object类)
  4. 树莓派:3安装NodeJS
  5. 李争——一个骨子里是极客的程序员
  6. alert 回调_JavaScript中到底什么时候回调函数Callback
  7. java PageUtil + stream 手动计算List 分页
  8. Wiz Editor md 为知笔记 Markdown 插件
  9. DAY8-Nessus漏洞扫描
  10. angular js的元素指令
  11. 2021漏洞扫描服务TOP20排行榜
  12. 算术平均数及几何平均数
  13. python3 英文字母大小写的转变
  14. 删除IE加载项及取消加载项的提示
  15. 测试iphone硬件好坏的软件,iPhone手机如何检测硬件故障,硬件检测必备技能,建议了解一下...
  16. 软件测试 | 期末复习——软件测试综述
  17. 失眠怎样才能改善睡眠,五款助眠产品推荐让你拥有好睡眠
  18. IM云服务领域,融云因何得以登上浪潮之巅?
  19. 作为程序员这些都是必读的书
  20. 江阴学院计算机科学系logo,江阴中专校徽暨校标(LOGO)征集活动

热门文章

  1. ascii非打印控制字符表_C程序打印ASCII表/图表
  2. 工程中多个不同类型线程池_软件工程中不同类型的设计策略
  3. 消息队列终极解决方案——Stream(上)
  4. ubuntu 系统下的Caffe环境搭建
  5. 字符串的模式匹配--BF算法KMP算法
  6. oracle gets/exec 单位,ORACLE AWR使用基础
  7. docker rabbitmq_使用Docker集成Rabbitmq与安装elasticsearch教程
  8. asp.net mysql 中文乱码_mysql4导入mysql5中文乱码问题
  9. solr java浏览器访问_solr解决访问安全
  10. 英雄无敌3高清 Android,安卓TOP10:《英雄无敌3》高清重制版上架