异常
异常就是程序出现了不正常的情况
编译时异常和运行时异常的区别
-
编译时异常
- 都是Exception类及其子类
- 必须显示处理,否则程序就会发生错误,无法通过编译
-
运行时异常
- 都是RuntimeException类及其子类
- 无法显示处理,但也可以和编译时异常一样处理
异常的默认处理方式
如果程序出现了异常,而调用者没有做出任何处理,最终Java虚拟机会做出默认的处理
- 将程序中异常的名称,错误原因以及异常出现的位置等信息输出在控制台
- 停止程序的继续执行
throws方式处理异常
代码格式
public void 方法() throws 异常类名 {
}
注意事项:
- throws是写在方法的括号后
- 编译时异常必须进行处理,使用try-catch或throws,在方法上进行显示声明
- 运行时异常因为在运行时才会发生,所以可以不在方法后声明异常,运行时出现异常默认交给JVM处理
throw抛出异常
代码格式
throw new 异常();
注意事项:
这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不再执行
throws和throw区别
throws | throw |
---|---|
用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
表示声明异常,调用该方法有可能会出现这样的异常 | 表示手动抛出异常对象,由方法体内的语句处理 |
try-catch处理异常
代码格式
try {
可能出现异常的代码;
}catch(异常类名 变量名) {
异常的处理代码;
}
执行流程
- 程序从try里面的代码开始执行
- 出现异常,就会跳转到对应的catch里执行
- 执行完毕之后, 程序还可以继续往下执行
注意事项
-
若try中没有遇到问题,怎么执行?
会把try中所有的代码全部执行完毕,不会执行catch中的代码
-
若try中遇到问题,那么try下面的代码还会不会执行?
若遇到问题,则直接跳转到对应的catch语句中,try下面的代码就不会再执行了
当catch里的语句全部执行完毕,表示整个体系全部执行完毕,继续执行下面的代码
-
如果出现问题没有被捕获,那么程序如何运行?
那么try-catch就相当于没有写,也就是try-catch没有处理,默认交给JVM处理
-
同时可能出现多个异常怎么处理?
出现多个异常,那就写多个catch就行
注意: 如果多个异常之间存在字符类关系,那么父类要写在子类的下面确保子类的catch先将其捕获
throwable成员方法
- getMessage(): 返回此throwable的详细信息
- toString(): 返回可抛出的简短描述
- printStackTrace(): 把异常的错误信息输出在控制台
自定义异常
当Java中提供的异常不能满足我们的需求时,我们可以自定义异常
实现步骤
- 定义异常类
- 写继承关系
- 提供空参和带参构造