------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
异常概述 | 含义 | 程序运行时出现的不正常 |
形式,以父类Throwable描述 | 对于程序的异常,JAVA以类的形式进行描述,并封装为对象,因此异常的表现形式为对象 | |
Error类 | 严重,一般不需编写代码解决 | |
Exception类 | 可以以针对性的处理方式进行处理 | |
Throwable类 | 含义 | Java中所有错误和异常类的父类 |
方法:getMessage() | 获取错误或异常的信息并以String形式返回 | |
方法:toString() | 复写的Object类方法,将“错误异常名字:信息”以字符串形式返回 | |
方法:printStackTrace() | 将“错误异常名字:信息”以及异常出现的位置以字符串形式打印输出,即JVM默认处理机制的调用方法 | |
异常处理 | try{} | 检测语句;try中的代码出现异常的代码之后的代码都不会执行 注意:应该在抛出异常的功能初次被调用的地方try,而不是最终调用者 |
catch{}(异常类类名 异常类对象名) | 接收异常对象,处理异常的代码(要么解决,要么抛出) 注意:catch中的其他代码应放在抛出的代码的前面,因为一旦抛出了,后面的代码便无法访问,编译失败。再次抛出的异常一般与接收的异常不同,是调用该功能的功能所能解决的异常 | |
finally{} | 一定会执行的代码; 某些代码一定要执行一下; 无论数据操作是否成功,都应该关闭数据库连接 无论操作是否成功,都应该释放调用的底层方法(如java在windows下创建文件,实际上调用的是windows的命令来创建,那么无论创建是否成功,都应该进行释放,因为占用了系统资源) 只有finally前面有语句:System.exit(0);时finally才不会执行 | |
注意 | 三者是一个整体,(可以没有finally),try没有检测出异常的话,catch不会执行。 可以没有catch,此时finally中定义一定会执行的代码,一般用于关闭资源。因为没有catch方法解决,因此该异常需要在方法体上声明,让调用者来解决 | |
异常声明 | throws 异常类类名1,异常类类名2 | 至于功能主体之前(即大括号之前),声明该功能有可能会出现问题,声明的异常类应该尽量具体精确 |
注意 | 方法若声明了异常,那么调用者必须处理(解决或抛出异常给其他异常类)或者在调用者方法的名称后,也抛出异常(最终抛给的是调用者方法的调用者,jvm) | |
多异常处理 | 注意1 | 多个异常不会同时发生,只要产生一个,程序就停止了。但每种异常都需要有对应的catch处理,因为不确定会出现哪种异常,但是不要定义多余的catch |
注意2 | 对于声明的不同异常,应有不同的catch方法,即catch的参数类型和声明时的一致,而不是使用父类参数类型来代替,否则相当于隐藏 | |
注意3 | 多个catch块的参数类型(异常类)如果出现继承的情况,级别越高的应越往后放,否则编译失败 | |
注意4 | catch应有具体的解决方法,不要简单的定义输出语句,仅用作学习 | |
注意5 | jdk1.7后一个catch语句可以捕获多个异常,即在括号中用|符号隔开: catch(异常类型1 | 异常类型2 | 异常名称3 异常名称) | |
自定义异常 | 自定义异常类 | class 自定义异常类名称 extends 异常类名称 注意父类应尽量具体而精确 |
自定义异常类特点 | 构造函数注意需要引用父类构造函数 | |
手动抛出异常 | 在方法体中,设定条件,如果满足该异常条件,并抛出异常,格式为: throw new 自定义异常类类名(构造参数) 实际上抛出的是自定义异常类的实体对象。 注意throw单独存在时,且一定会执行(没有执行条件,不是100%执行)下面不要定义语句,因为该语句100%无法访问,编译会失败 | |
处理 | 如果方法体中使用throw抛出了异常,那么必须进行处理(解决或抛出) | |
声明 | 如果方法体中使用throw抛出了异常,并且在本方法内没有catch方法解决,需要在方法上进行声明(RunTimeException类及其子类除外,不需要声明) | |
RunTimeException及其子类 | 特点1 | 方法体中用throw抛出该类或其子类异常,可以不在方法上声明 |
特点2 | 尽量不用处理,让程序在此处停掉 | |
功能复写时的异常特点(RuntimeException不受此限制) | 父类throws异常 | 子类只能throws该异常类或者该异常类的子类 |
父类throws多个异常 | 子类只能throws多个异常类的子集 | |
父类没有异常,但子类存在异常 | 子类不能在方法体上throws,并且需要在方法体内部try解决 | |
子类存在父类没有throws的异常 | 同上,子类不能在方法体上throws该异常,在内部解决 |