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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python tcp服务器并发_python tcp并发服务器

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

OpenCV Mat基础认知感

OpenCV是一个开源的供开发的计算机视觉处理库&#xff0c;涵盖的内容包括图像处理&#xff0c;机器学习。由c到c &#xff0c;再到各平台的跨平台框架。 Mat - 图像容器 Mat类用于表示一个多维的单通道或者多通道的稠密数组。能够用来保存实数或复数的向量、矩阵&#xff0c;…

layui多文件上传讲解_Layui 多文件上传 SSH

jsp 页面pageEncoding"UTF-8"%>Insert title here选择多文件文件名大小状态操作开始上传layui.use(upload, function(){var $ layui.jquery,upload layui.upload;//多文件列表示例var demoListView $(#demoList),uploadListIns upload.render({elem: #testLis…

OpenCV:H1.type() == H2.type() H1.depth() == CV_32F

如题&#xff1a; E/cv::error(): OpenCV(4.1.0) Error: Assertion failed (H1.type() H2.type() && H1.depth() CV_32F) in compareHist, file /build/master_pack-android/opencv/modules/imgproc/src/histogram.cpp, line 1936 E/org.opencv.imgproc: imgproc::co…

css 外弧_css 伪类实现弧形

在实现页面五花八门的有特色的ui时&#xff0c;我们有时会遇到要用实现一个弧形&#xff0c;而这样的弧形要怎么实现呢&#xff1f;用图片&#xff1f;不太优雅&#xff0c;这样就要无故多加载一张图片了&#xff0c;这里来说说怎么用css的after伪类来实现弧形。总思路&#xf…

C++期末实践程序设计与数组作为参数的注意事项

目录小表弟发来的求助信号要点代码文件头文件Student.h源文件Student.cppmain.c执行结果c数组特性以及数组做形参的特点数组试验数组特殊性质不允许拷贝和赋值数组是通常被转化成指针使用数组形参多种写法代理模式MVC模式小表弟发来的求助信号 并补充说要5种写法才算过关。 要…

sgm3157功能_SGM3157_SGM3157供应商_价格_Datasheet_pdf资料-IC资料网

SGM31574.5惟 Low Voltage SPDT Analog SwitchSGMICROSG Micro CorpLow Voltage SPDT Analog Switch in 6-Pin SC70SGMICROSG Micro Corp4.5惟 Low Voltage SPDT Analog SwitchSGMICROSG Micro CorpFLAT WASHERS NYLON FIBREetc2List of Unclassifed Manufacturers70 MHz Bandp…

windows 7远程桌面和被远程连接电脑启动远程桌面服务

目录远程桌面连接开启远程桌面服务&#xff08;被连电脑&#xff09;配置启动远程桌面服务远程桌面连接 这部分主要讲解如何通过一台windows 电脑的远程桌面程序连接"远程"电脑桌面。前提是被连的那台电脑已开启远程桌面服务。远程桌面服务开启之后&#xff0c;可以…

desktop docker 无法卸载_关于Docker:Docker – 无法移除死容器

我无法删除死容器&#xff0c;它在重新启动Docker服务后再次出现。docker ps -aCONTAINER ID STATUS11667ef16239 Dead然后docker rm -f 11667ef16239然后&#xff0c;当我运行docker ps -a时&#xff0c;没有Docker容器显示。docker ps -aCONTAINER ID …

git 命令详解和Android Studio代码管理工具

目录前言git命令上传项目一、核心操作二、解决冲突三、情景举例四、查看ssh密钥五、克隆远程项目六、回退某个操作七、和远程分支建立关联八、删除文件九、远程仓储十、多人协作十一、分支策略十二、其他Android Studio代码管理控制前言 相比SVN CVS的管理模式&#xff0c;git…

表单和字都居中_APP 分享 | 6 款黑科技工具,低调收藏,每一款都很强大!

iSlide 简单、高效地制作PPT使用环境: Windows使用要求: Office 2010 及以上版本授权状况: 无广告 有付费功能官网地址: www.islide.ccSlide是一款基于PowerPoint的插件工具,功能十分强大,高效做PPT必备利器一键优化:将PPT中不规则的字体,段落,色彩,参考线…

Android studio gradle task list 不显示问题

问题描述 新电脑安装android studio后&#xff0c;导入工程&#xff0c;各种配置都弄好变更好&#xff0c;出现了如下情况&#xff1a; 之前习惯的gradle task 不在列表中&#xff0c;好不习惯。 正常期望如下&#xff1a; 处理方法 快捷键Ctrl Alt S或者 file -> se…

python flask高级编程之restful_python Flask实现restful api service

一直在用node.js做后端&#xff0c;要逐步涉猎大数据范围&#xff0c;注定绕不过python&#xff0c;因此决定把一些成熟的东西用python来重写&#xff0c;一是开拓思路、通过比较来深入学习python&#xff1b;二是有目标&#xff0c;有动力&#xff0c;希望能持之以恒的坚持下去…

Android Studio Gradle输出信息乱码

在更换android studio 版本之后&#xff0c;一般windows 版本在项目构建过程中&#xff0c;gradle 相关的信息输出&#xff0c;会出现乱码&#xff0c;基本上明知是字符编码的问题&#xff0c;但看着就是不爽&#xff0c;例如下面这的情形&#xff1a; ע: ijЩ&#xfffd;&am…

python tkinter布局混用_python tkinter布局界面如何实现?

当我们自己走入一个互联网窗口里&#xff0c;寻找内容&#xff0c;清晰而明朗&#xff0c;这就是涉及了一个页面布局的知识&#xff0c;不只是一个站点&#xff0c;一个网页&#xff0c;设置是一个窗体都是有清晰的布局&#xff0c;语言的编写&#xff0c;就是为了效率执行而存…

Edge 修改字符编码(详细图文)

Microsoft Edge 版本 97.0.1072.62 (官方内部版本) (64 位) 前言 如下图&#xff0c;在访问页面时出现乱码&#xff0c;而且一直返回的内容编码是UTF-8&#xff0c;但Edge没找快捷的编码方式选择 方法一 Internet Explorer 模式加载 打开Edge浏览器 点击Edge右上角三点 点…

json tcl_确定TCL中变量的类型

Tcl的变量没有类型(除了他们是否真的变量的关联数组 - 即使用$foo(bar)语法 - FO r你使用array exists)但Tcl的值。好吧&#xff0c;有点。 Tcl可以在不同类型之间进行变异&#xff0c;因为它认为合适&#xff0c;并且不公开这些信息[*];你所能做的就是检查一个值是否符合特定的…

【Android】Unresolved reference: databinding

检查配置 对应module的build.gradle是否添加了databinding配置 buildFeatures {viewBinding true } // 或者 dataBinding {enabled true }检查包名(特别注意) 报错的包名是否和app包名一致。 例如app包名是 com.xxx.app 而报错的代码中binding的包名路径不在app包名下&…

水塔清洗机器人_最全的中央空调清洗流程

一、施工方案和技术措施项目总体施工纲要积极主动与客户沟通协调。做好现场的勘查工作&#xff1a;严密、详细、周全。掌握客户的动态&#xff0c;不断完善施工进度表。分项目制定严密的施工方案、计划和管理措施。制定详尽的突发事件应急预案。建立安全责任制&…

【Android】ConstraintLayout中RecyclerView 的底部数据显示不全以及覆盖其他View

文章目录xml布局内容预览画面(看着没毛病)&#xff1a;实际画面&#xff1a;解决办法说明xml布局内容 <?xml version"1.0" encoding"utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android"http://schemas.android.com/a…