1.异常继承体系
异常有很多一个个的类,包含一些继承关系。
- Throwable:java中所有异常和错误的根类
- Error:错误类,不是我们能处理的。
- Exception:异常类,描述程序中的异常
- Runtime:运行时异常
异常的分类:
- 运行时异常(RuntimeException)
- 程序可以正常编译,异常的产生是发生在程序运行过程中。
- 非运行时异常(None-RuntimeException)、编译时异常
- 程序无法编译
对程序的影响:
- 运行时异常:运行过程中遇到未经处理的异常,程序会被终止
- 非运行时异常:遇到未经处理的异常(unhandled),无法通过编译
2.异常处理
异常处理使用try-catch-finally
基础语法:
try{
//可能会出现异常的代码
}catch(异常类 异常对象){
//捕获指定类型的异常
}finally{
//这里的代码始终会执行
}
- try不能单独存在,必须跟catch和finally至少一个,或者都有
- try是主体,不能没有try,只有其他两个
- 如果try中的代码出现异常,从异常开始的位置以后的代码都不执行(try中)
- 一个try可以跟多个catch,可以在不同的catch中做不同的处理
- 如果多个catch捕获的异常,彼此之间没有关系,那么catch的先后顺序无所谓
- 如果多个catch捕获的异常,是有继承关系存在的,那么必须使子类异常在前,父类异常在后
- 如果try中代码有多处异常,且每个异常的处理方式都一样,那么可以捕获他们的父类异常
- 分组异常捕获
- 可以将多种异常放到一个分组,进行统一的捕获和处理
- 将多个异常用
|
进行连接
3.throw和throws
throws:
- 用在方法声明部分,表示一个方法有一个异常
- 此时这个异常在此不用处理,交给方法调用处处理
- 规范:只要某个方法有未经处理的异常,最好将throws加上
throw: - 程序中,我们捕获到的都是一个个异常对象
- 实例化一个异常对象,对程序没有什么影响
- 如果一个异常对象需要影响到程序,那么就将这个异常对象抛出
4.自定义异常
为什么要自定义异常?
系统给我们提供了很多异常类,但是这些异常类也是有限的,不能满足我们的需求。当我们需要抛出的异常类,已经超出了系统给我们提供的异常类描述范围,此时我们就要自定义异常
如何自定义异常类?
继承自Exception或RuntimeException,创建一个异常子类
- 继承自Exception类的是编译时异常
- 继承自RuntimeException类的是运行时异常
规范:自定义异常,命名必须以Exception做结尾
案例1:
try{
int num = 10/0;
}catch(ArithmeticException e){
throw new ArithmeticException("除数为0");
}finally{
}
案例2:
class MyException extends RuntimeException{
public MyException(String message){
//message是异常的信息提示,可以在控制台看到
super(message);
}
}