异常类体系
- 异常是指在程序运行期间发生的非正常情况,例如,角标越界、除0运算等,为了更好的将正常流程代码和这些非正常的处理代码分离,提高阅读性,Java将这些非正常的情况的描述封装成对象,称之为异常类。
- 每一个类型的非正常情况都会被封装成一个异常类,那么将这些类的共性向上抽取,就形成了异常体系。
- 最终,形成了一个最终基类—Throwable(当然它也是继承java.lang.Object),该类所有直接或间接子类都具有可抛性,即,问题发生时,可以抛出,让调用者知道并处理。
- 可抛性通过两个关键字来体现,throws throw ,凡是可以被这两个关键字所操作的类和对象都具备可抛性。
- Throwable类有2个直接子类Error和Exception
- Error类:由jvm抛出的严重性的问题,不可处理,需要修改程序。
- Exception类:就是我们要处理的问题。这个类的子类的后缀名都是用其父类名Exception作为后缀,有很好的阅读性。
自定义异常类
Java已给我们提供了很多异常类,如下图,这只是Exception类的直接子类,
但有时,我们也会要自定义异常类,如何操作呢?
非常简单,只要继承异常体系就可以了。这样就具有可抛性,才可以被两个关键字所操作(throws throw);
class MyException extends Exception{
MyException(){}
MyException(String msg){
super(msg);
}
}
Exception分类
Exception类下有个直接子类RuntimeException,非常重要,它的存在,决定了Exception被分为两大类:
1. 编译时异常
不是继承RuntimeException类的异常类;
编译时就抛异常,提醒开发者做针对性处理。
2. 运行时异常
继承RuntimeException类的异常类
编译时不不检测异常,而是在程序运行时,让程序强制停止,让调用者对代码进行修正。
所以自定义异常时,要么继承Exception。要么继承RuntimeException。
throws 和throw的区别
- throws使用在函数上,throw使用在函数内。
- throws抛出的是异常类,可以抛出多个,用逗号隔开。throw抛出的是异常对象。
//
public int getArrayByIndex(int[] arr,int index){
if(index>=arr.length){
throw new ArrayIndexOutOfBoundsException("数组的角标越界:"+index);
}
return arr[index];
}
异常处理
异常处理的原则:
1. 方法中如果抛出需要检测的异常,那么要么在方法上声明,要么函数内用trycatch捕捉,否则编译失败。
2. 如果调用到了声明异常的方法,要么trycatch要么throws,否则编译失败。
3. 功能内容可以解决,用catch,解决不了,用throws告诉调用者,由调用者解决 。
4. 一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
try-catch格式
try{
//需要被检测异常的代码。
}
catch(异常类 变量)//该变量用于接收发生的异常对象{
//处理异常的代码。
}
finally{
//一定会被执行的代码。
}
异常的注意事项
- 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
- 如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
- 如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try 。