一、异常的理解及体系结构图
1、理解
异常:程序运行过程中发生的不正常现象。
java中的错误:
语法错误
运行异常
逻辑错误
2、体系图
java程序在执行过程中所发生的异常分为两类:
Error:Java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况(StackOverflowError、OOM),一般不编写针对性的代码进行处理
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。
常见的异常可分为两类:运行时异常和编译时异常。异常体系图如下,其中红色部分为受检异常,蓝色部分为非受检异常。
二、异常处理的方式
1、抓模型
(1)语法
try{
①
//容易出现异常的代码
②
}catch(异常类型 e){
//处理异常的语句
③
}finally{
//最后一定要执行的语句
④
}
⑤
执行顺序 ★
如果出现了异常: ①③④一定执行,⑤不一定。如果异常被成功捕获,而且没有其他跳转,⑤会执行,否则⑤不执行
如果没有出现异常:①②④一定执行, ⑤不一定。如果没有其他跳转,⑤会执行,否则⑤不执行
(2)好处
①提高了用户体验性
②将正常代码和容易出错的代码实现了分离,提高了代码的阅读性和维护性
③如果成功捕获异常,则起到了拦截异常的作用,异常后面的语句会正常执行
(3)注意事项
①catch块可以省略
②finally块可以省略
③尽量使用多个catch块,代替多个try catch
④不能滥用异常
⑤catch块可以有多个,但如果catch块的异常类型为父类类型,需要将该catch块放在最后
2、抛模型(默认异常处理方式)
(1)语法
修饰符 返回类型 方法名(参数列表) throws 异常类型XX{
}
注意:异常类型XX为方法中容易出现的异常的类型或父类类型
(2)执行特点
将异常抛给调用方,如果调用方不处理,则继续往上抛,直到抛给jvm。而jvm使用的是默认的处理方式。e.printStackTrace()
三、自定义异常
1、语法
class XXException extends Exception或RuntimeException{
public XXException(){}
public XXException(String msg){super(msg);}
}
2、如何使用自定义异常
在需要生成异常对象的地方,添加如下语句:
throw new XXException(异常信息);
四、常见问题解答
1、生成异常对象的方式
2种方式:
方式一:系统自动生成异常对象
针对于:系统定义好的异常类
方式二:手动生成异常对象
针对于:系统定义好的异常类和自定义的异常类
语法:throw new 异常类型(实参);
2、子类重写父类方法的异常说明
子类重写的方法抛出的异常类型可以相同或为子类类型
class Father{
public void run() throws Exception{}
}
class Son extends Father{
public void run() throws Exception{}
}
class Daughter extends Father{
public void run() throws IOException{}
}
3、throws和throw对比
说明 | 放的位置 | 后面跟的东西 | |
throws | 异常处理的方式 | 方法声明的地方 | 异常类型 public void method throws XXXException{} |
throw | 生成异常对象的关键字 | 方法体中 | 异常对象 throw new XXXException(msg) |