Java异常处理机制其最主要的几个关键字:try、catch、finally、throw、throws,以及各种各样的Exception。本篇文章主要在基础的使用方法上,介绍了如何更加合理的使用异常机制。

try-catch-finally
try-catch-finally块的用法比较简单,使用频次也最高。try块中包含可能出现异常的语句(当然这是人为决定的,try理论上可以包含任何代码),catch块负责捕获可能出现的异常,finally负责执行必须执行的语句,这里的代码不论是否发生了异常,都会被执行。
针对这部分,因为很基础,所以就提几点比较关键的建议:
1、当你在写try-catch语句的时候,脑子里是知道自己要去针对哪种异常进行处理的,不要只是以防万一,加了个catch(Exception e),这是毫无意义的。并且,一个try块中可能有多个异常,对于每一类异常,要分别写一个catch进行捕获。
2、针对可能出现异常的语句进行try-catch,大段代码的try-catch会非常不利于维护代码时定位异常可能发生的位置,对于肯定不会发生异常的稳定的代码,不需要放在try块中。
3、try-catch虽然在功能上,可以成为流程控制的工具,达到条件分支的效果。但相比于if-else语句,java的异常处理机制基于面向对象的思想,使用过程中需要更多的时间与空间的开销,所以不要用异常机制去做基本的条件判断,只有在程序会因为异常而中断时进行捕获和处理。
4、finally块中永远不要写return语句,因为finally块中总是最后执行,他会改变预期在try和catch块中的返回值(举个例子,你在catch中捕获了一个异常并抛出e,又在finally语句中return true,这样你抛出的异常就"消失"了,因为当前函数的执行结果已经从抛出异常 转变成 return true)。另外,在使用资源对象与流对象时,finally块必须对资源对象、流对象进行关闭。
Java异常体系结构
Java异常体系的基类是Throwable,它主要有两个子类:Error 和 Exception。其结构如下图:
上图中,Error是指程序无法处理的错误,多指系统内部比较严重的错误。大多数这类错误与开发人员无关,我们关注的主要是Exception。
Exception主要分为两块:运行时异常和非运行时异常。RuntimeException及其子类都称为运行时异常;除此之外, 所有Exception的子类异常都是非运行时异常。
运行时异常多指程序逻辑上出现问题(也就是我们自己写代码逻辑出了问题),常见的错误包括 ClassCastException:类型转换异常、NullPointerException:空指针异常、IndexOutOfBoundsException:越界异常...这些异常都可以通过程序逻辑处理来避免(比如加一个判断语句判断是否越界、是否属于某类型、是否为null),所以编译器把这些工作交给了程序员来把控,在编译期即使手动抛出了一个运行时异常不去捕获,编译器也会通过。因而这类异常也叫做"未检查异常"(uncheck)。同样属于未检查异常的还有所有的Error。即上图中,所有蓝色框表示未检查异常,橙色框表示"检查异常"(check)。对于检查异常,在可能发生异常的位置需要用try-catch块去捕获并处理,如果不处理它,就会一直向上层调用抛出,直到被处理为止。
throw 与 throws
throws关键字主要在方法签名中使用,用于声明该方法可能抛出的异常。throws 可以理解成是一种通知行为,没有实际的抛出异常的动作,而仅仅是告诉调用他的上层函数,这里可能会抛出这个异常;
throw用于在函数体内语句中,表示抛出一个实际的异常的实际动作,如果在函数内没有捕获并处理,那么将会一直向上抛出这个异常直到被main()/Thread.run()抛出。
当一个函数throws声明函数可能抛出一个非运行时异常(检查异常)时,那么即使这个函数内部不显示使用throw,调用它的上层函数也必须包含处理这个异常的代码。举个例子:
public class Main {
public static void main(String[] args){
exceptionTest();
}
static int exceptionTest() throws IOException {
return 0;
}
}
上述代码中调用的exceptionTest函数声明抛出一个IOException属于检查异常,哪怕exceptionTest函数中不可能抛出这个异常,调用它的函数也必须对此异常做出捕获处理。现在main函数中没有相关的处理逻辑,所以会编译错误,如下图:
而对运行时异常,就是另一种情况了:
public class Main {
public static void main(String[] args){
int i = divideTest(0);
System.out.println(i);
}
static int divideTest(int b) throws ArithmeticException {
int i = 5/b;
return i;
}
}
同样在main函数没有处理异常的逻辑,这次声明抛出的异常是ArithmeicException,他属于运行时异常(RuntimeException),所以编译器对声明的抛出置之不理:
虽然编译期通过,但在运行时程序仍然会自动抛出运行时异常,并一直向上抛出到Main函数。而Main()中没有对该异常的捕获处理,所以主线程终止。
结论:我目前的理解是,throws一个运行时异常是没有任何实际意义的,除非你为了遵循某个统一的规范而这样做。throws 存在的意义主要是将可能的非运行时异常交给编译器把关,让编译器监督开发人员对这些异常进行捕获处理。
另外,当你需要自定义一个异常时,如果需要在编译期检查,并在上层统一处理,那么直接继承Exception成为一个检查异常;如果不需要编译期检查,抛出异常表示程序异常需要直接中断,那么继承RuntimeException成为一个运行时异常即可。
希望本篇文章可以对各位朋友有所帮助!
# java
# 异常
# java异常处理
# java异常处理机制示例(java抛出异常、捕获、断言)
# java异常(Exception)处理机制详解
# java多线程中的异常处理机制简析
# Java异常分类以及几种处理机制分析讲解
# 抛出
# 子类
# 这是
# 可能出现
# 不需要
# 你在
# 这类
# 成为一个
# 开发人员
# 图中
# 可能发生
# 如下图
# 举个例子
# 主要是
# 几个
# 就会
# 是一种
# 放在
# 多指
# 也会
相关文章:
太原网站制作公司有哪些,网约车营运证查询官网?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何快速搭建高效WAP手机网站吸引移动用户?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
制作农业网站的软件,比较好的农业网站推荐一下?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何在Golang中使用replace替换模块_指定本地或远程路径
简单实现Android验证码
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
手机网站制作与建设方案,手机网站如何建设?
如何快速启动建站代理加盟业务?
c++怎么用jemalloc c++替换默认内存分配器【性能】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在建站之星网店版论坛获取技术支持?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
广州美橙建站如何快速搭建多端合一网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何快速生成ASP一键建站模板并优化安全性?
如何在宝塔面板中创建新站点?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
制作网站的软件免费下载,免费制作app哪个平台好?
临沂网站制作企业,临沂第三中学官方网站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
制作营销网站公司,淘特是干什么用的?
建站主机选购指南:核心配置优化与品牌推荐方案
哈尔滨网站建设策划,哈尔滨电工证查询网站?
已有域名和空间如何快速搭建网站?
建站之星安装后如何自定义网站颜色与字体?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
,南京靠谱的征婚网站?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何通过虚拟主机快速搭建个人网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何登录建站主机?访问步骤全解析
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
建站之星后台管理系统如何操作?
如何通过wdcp面板快速创建网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
宝塔建站无法访问?如何排查配置与端口问题?
南京网站制作费用,南京远驱官方网站?
微课制作网站有哪些,微课网怎么进?
,如何利用word制作宣传手册?
建站主机类型有哪些?如何正确选型
宝塔Windows建站如何避免显示默认IIS页面?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何快速选择适合个人网站的云服务器配置?
*请认真填写需求信息,我们会在24小时内与您取得联系。