一、本期教学目标
- 能够列举出常见的三个运行期的异常。
- 能够使用try...catch、throws等关键字处理异常。
- 能够自定义异常类。
- 能够处理自定义异常类。
二、前言
上一期我们是学习了异常相关的一些概念知识,然后演示了一下异常的触发及控制台异常的一些信息如何判断及如何定位异常发生代码行,对吧。今天我们就要来继续深入学习异常类,学习异常如何处理、自定义异常及处理自定义异常,非常的硬核,希望大家好好听。
三、正文
1.异常分类
说起异常,难道就一种吗?不不不,异常也是分类的,可大体分为以下两类:
- 编译时异常:checked异常。表示在编译时期就会检查是否存在异常,如果没有对异常进行异常处理,则会编译失败。
- 运行时异常:runtime异常。表示在运行时期检查是否存在异常,但在编译时期运行时异常是不会编译器检测到的,借此对于该异常是可以处理的。
如下是我给大家总结的一张异常分类流程图,帮助大家能更清晰的认识。
所以大家可能就会想一个问题了,如果程序出现异常,我们怎么办?有没有办法去对异常做一些处理,这是有的。一旦异常出现,我们就要对出现异常的代码进行修复。
2、异常处理
对于异常处理,有如下五个关键字:try、catch、finally、throw、throws。这些我会一一给大家讲解的哈。我们先来学一个关键字--throw。
在平时写代码时,我们必须要考虑到程序出现异常的情况,比如定义方法时,调用方法入参类型不对,那我们就应该抛出异常告知调用者,入参类型有误,请传递正确的入参类型。就好比这种情况,我们就应该抛出异常的方式来告知调用者。
java就给我们提供了这么个关键字,throw,专门用于抛出异常对象。那么具体对于throw如何抛出一个异常对象?请继续往下看。
- 创建一个异常对象,可封装一些自定义的提示信息好告知调用者。
- 需要将异常对象反馈给调用者,具体怎么反馈呢?将这个异常对象传递到调用者处,并结束当前方法。
如下是对于throw关键字的使用格式:
throw new 异常类名(参数);
我给大家列举几个例子,你们就会明白了。
throw new NullPointerException("要访问的arr数组不存在");
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出索引范围");
3、实例演示
如上我是已经教学了如何通过throw关键字来进行异常抛出,那么我们既然学习完抛出异常的格式后,我再通过下面程序演示下throw的具体使用。这也是边教学边实战。
@Test
public void test2() {
//定义一个数组
int[] arr = {1, 2, 3, 4};
//根据数组角标获取元素。
int index = 5;
int value = this.getArrByIndex(arr, index);
System.out.println(index + "角标值为:" + value);
}
如下是自定义异常抛出的具体使用。
private int getArrByIndex(int[] arr, int index) {
if (index < 0 || index > arr.length - 1) {
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出角标范围");
}
return arr[index];
}
这里就需要大家注意,至于何时要异常抛出?你就可以这么理解,如果条件满足,当执行完throw抛出异常后,方法就已经终止运行了,这时也就结束了当前方法,并将异常返回给调用者。这时也就是我们通过throw关键字进行异常信息抛出。
大家可以看下上方示例的结果控制台展示:
给大家解释一下,示例上的arr数组长度为4,下标范围为[0,3],而我获取arr[5],下标肯定是不存在的,所以肯定会进入异常判断,接着就执行throw语句,抛出异常信息。
4、总结
总而言之,如果程序出现了异常,我们就可以通过throw将异常抛出,也就是将问题返回给方法调用者。而对于调用者而言,该如何处理呢?其实呢调用者也是有多种选择,一它可以将异常捕获自己处理,二是它可以不管继续将异常抛出去,使用throws声明处理。不过这些我讲的目前你们可能不是能理解,我后续会讲到的,放心哈。