本文讨论了Java中异常体系、自定义异常及异常处理方案
一、认识异常
什么是异常呢,在Java中,异常是代表程序代码在编译或者执行的过程中可能出现的错误。异常可以分为两种,一种是编译时异常,另一种是运行时异常。下面对这两种异常详细进行介绍。
1.1运行时异常
运行时异常特点是编译阶段不会报错,运行时才可能出现!提醒不属于激进型。例如数组越界,算数时除数为0等
执行结果:数组越界异常:ArrayIndexOutOfBoundsException
1.2编译时异常
编译时异常的特点是编译阶段就报错,提醒比较激进,例如读取磁盘某文件
运行结果:无法运行,激进提醒
二、异常体系
异常体系最顶端是来自Java.lang.Throwable,可以分为两种,一种是Error,代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来,属于我们程序员无法管控的异常,这类异常一旦产生,编译程序都会直接崩溃。另一种是Exception,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的孩子来封装程序出现的问题。Exception是所有可管控异常的父类,实现孩子有RuntimeException和其他异常,除了RuntimeException外,其他异常均属于编译时异常。
三、异常处理
异常处理方案可以分为两种,一种是抛出异常,在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。格式是方法名 throws 异常类型。第二种是捕获异常,直接捕获程序出现的异常,格式是try{可能发生异常的代码}catch(异常类型 变量名){放捕获异常的代码,目的是给开发人员消息提示,给用户友好信息提示}。下面将对这两种方法进行实操演示
3.1抛出异常
在原有的读取磁盘某文件**编译时异常添加异常类型,可以是具体某种类型的异常,也可以是Exception,将底层的异常抛出去给最外层,最外层集中try...catch捕获处理。
最外层已经捕获到test2抛出的异常,要进行try...catch处理,此时最外层不能继续throws向外抛,否则这个异常会直接响应给前台用户
3.2try...catch处理
刚刚我们讲到方法是可以对异常进行外抛给调用者统一处理,但也可以但对异常进行try...catch处理,那样可以防止程序阻塞,直接恢复程序
注意:为了解决使用父类异常导致职责不清晰的问题,在使用try...catch时,开发人员如果知道是异常的种类,应该给出具体的异常响应和友好提示给用户,如果不知道是何种异常,应该在最后补充一个应该补充一个父类异常,适配特殊情况
四、异常的作用
4.1特殊返回值
有时候做一些算法运算时可能会产生算数异常的问题(如除数为0时,程序应该返回具体的异常问题而并标上-1,0这种结果,归根到底就是意义不明确),或者类型进行转换时可能会出现类型转换异常,这时候就可以通过异常信息来返回给调用者,方法执行的具体问题。
运行结果
4.2定位Bug
异常是用来定位程序bug的关键信息,在发生异常的地方会出现对应的代码位置,这时候只需要点击第1个代码就可以跳转到对应的异常代码位置
五、自定义异常
5.1为什么需要引入自定义异常?
Java无法为这个世界上全部的问题都提供异常类来代表, 如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。
5.2自定义运行时异常
实现步骤:
-
先定义一个自定义类
-
继承运行时异常父类RuntimeException
-
重写构造器
4. 通过throw new 异常类(xxx)来创建异常对象并抛出
5.3自定义编译时异常
实现步骤:
- 先定义一个自定义类
- 继承运行时异常父类Exception
- 重写构造器
4. 通过throw new 异常类(xxx)来创建异常对象并抛出
也可以直接try...catch处理,恢复程序
程序运行结果: