-
什么是异常
-
程序执行产生了非预期的结果(突然下降冰雹,天气预报说是晴天),此时程序会终止运行
-
异常的体系结构
-
说明
根接口是Throwable
异常(exception):通常发生后可以处理(可保证程序的正常执行)
运行时异常:系统异常
自定义异常:根据业务需要自己定义的异常
可自定义系统异常(继承RuntimeException)
可自定义普通异常(继承Exception)
错误(Error):一般指编译时,语法不对产生的,编译都不能通过更不用谈执行了
-
-
常用系统异常有那些
ArithmeticException 算术异常类,如以零做除数
ArrayIndexOufOfBoundsException 数组下标越界异常
NullpointerException 空指针异常
ClassNotFouundException 不能加载所需的类
IOException 输入输出异常
SQLException 操作数据库异常
FileNotFoundException 文件末找到异常
llegalArgumentException 非法的参数异常 -
如何自定义异常类
-
可自定义系统异常(继承RuntimeException)
-
可自定义普通异常(继承Exception)
-
它们的区别
前者处理异常的方式只有:抛出,抓住
后者多一种方式:JVM处理(建议使用后者)
-
-
什么是异常处理
- 对可能发生的异常行为进行处理
-
异常处理的作用
- 完善代码功能(有漏洞就会有异常),保证程序的正常运行
-
如何使用异常处理(默认是JVM处理)
-
抛出异常,让调用者来处理
在方法名后抛出
关键字:throws
语法
方法的定义 方法名 throws 异常类名1,…,异常类名n{} 说明 调用此方法时需要解决异常 继续抛出 使用try-catch语句块 如果是系统异常,什么都不做交给JVM处理 我们需要抛出的一般是自定义异常
在方法体内抛出
关键字:throw
语法
throw 异常对象
说明
如果抛出异常对象是自定义异常就需要解决异常
继续抛出
使用try-catch语句块
图解如果抛出的异常对象是系统异常,可什么都不做交给JVM处理 通常是:new 异常类型(变量数据+"异常信息");这样的形式构造异常对象 通用系统异常类型就用,节省工作量 如:IllegalArgumentException
-
抓住异常,直接处理掉异常
执行流程
try是必须的:程序执行try中语句块时,一旦发生异常,try中剩余的代码不会执行
如果有catch(finally)至少有一个
先判断发生的异常对象是否这catch捕获的异常对象或是其子类
如果是就进行catch语句块
如果不是就跳转到下个catch语句块进行相同的操作
如果有finally(catch)至少有一个
无论如何总会执行
处理异常的编码思路
打印异常信息,方便弄清问题所在
异常对象.printStackTrace()打印堆栈信息
异常完整类名:异常信息
发生异常的起始位置
如果只想获取异常信息:异常对象.getMessage()
输出提示,并根据需求处理此异常
编码方式
trach-catch:抓住异常并处理
语法
try{
可能发生异常的代码段;
}catch(异常类型变量){
异常处理操作;
}…
catch(异常类型变量){
异常处理操作;
}
说明
可以有多个catch语句块多个catch语句块时,根据异常对象的层级关系从小到大写(这样代码才合理) 非层级关系的异常对象可合并一起写,减少catch语句块个数 选择需要异常处理的代码块,按alt+shift+z可快速构建try-catch块 trach-catch-finally:抓住异常并处理,最后释放相应的资源 语法 try{ }catch(异常类型 变量){ } … catch(异常类型 变量){ }finally{ 释放资源的代码; } 说明 不可有多个finally 从上到下,都要执行的代码放在finally块中(如:关闭流) 除非你手动退出JVM,否则在JVM终止程序前总会执行finally语句块的(一般不会这样做) 虽然try可只与finally组合使用,没意义(因为没异常处理呀)
-
让JVM处理异常
终止程序执行
在控制台输出堆栈信息
异常完整类名:异常信息
发生异常的起始位置
图解
-
-
说明
-
程序中有异常必须处理,不处理就是错误(编译不通过)
-
处理异常总共3种方式,自行选择(如果是自定义普通异常只有2种选择)
-
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类(解释如下)
- 子类不能抛出父类没有的异常
- 如果被重写的方法没有异常抛出
那么子类的方法绝对不可以抛出异常
如果子类方法内有异常发生,那么子类只能try,不能throws
-
如何选择处理异常的方式
- 如果想让程序继续运行选择抓住异常
- 如果只是想看异常信息选择抛出异常
首选JVM处理方式
次选抛出异常
-
final,finally,finalize的区别
- final:修饰类或类成员
- finally:异常处理的语句块
- finalize:Object定义的垃圾回收机制的方法
-
finally与return混合使用时,return如何返回
- 如下代码输出结果是?
- 结果是:5
- 分析
- return的作用是:结束方法调用或返回值
- 没有异常,程序会走try,会走finally
- 执行try:a变成了2,此时return a只起到返回值的作用(把结果放进函数栈),没结束方法
- 执行finally:a变成了5,此时return a既返回值,又结束方法调用,所以最后结果是5
- 扩展
- 如果注释finally后面return语句,输出结果就是2
- 如果在a+=1后面抛出异常,throw new Exception();需要删除 return a;语句输出结果就是7
- 如下代码输出结果是?
-