java 异常和异常处理
异常:程序不正常的行为或者状态
例如 数组越界、除0异常、访问某个不存在的文件
异常处理的目的:
程序返回到安全状态
允许用户保存结果,并以适当方式关闭程序
抓住异常,分析异常内容
1.异常分类
Throwable:所有错误的祖先
Error:系统内部错误或者资源耗尽
Exception:程序有关的异常,重点关注
RuntimeException:程序运行时异常
非RuntimeException: 外界相关的错误,典型的如IOException,访问的文件不存在的时候、连接不存在的数据库的时候会产生该异常
2.异常处理
try-catch-finally:一种保护代码正常运行的机制(至少要有try,catch和finally至少要有一个)
try:里面写正常的业务逻辑代码
catch:当try发生异常的时候,将执行catch中的代码,若无异常,则不执行。catch可以有多个,每个有不同的形参,当发生的异常类型和其中的某个相匹配的时候,将执行其中的代码,一个异常 只能进入一个catch块。如果没有匹配的,catch不会执行,直接finally 。
catch的匹配是从上到小进行匹配的,一般将小的异常写在前面,大的写后面
finally:一定会执行(哪怕catch中又发生了异常)
catch-finally中都有可能再次发生异常,因此可以在这些模块里面嵌套try-catch-finally语句
3.throws来声明异常
方法可能存在异常语句,如果不处理,可以使用throws来声明这个方法
调用带有throws Unchecked异常的方法,要么处理这些异常,要么再次向外throws,直到main函数为止
4.重写中的异常
一个方法如果被重写,重写它的方法必须抛出相同的异常,或者异常的子类(或者不抛)
如果父类的方法抛出多个异常,那么重写的子类方法必须抛出那些异常的子类,也就是不能抛出新的异常
5.自定义异常类
自定义异常需要继承Exception类或其子类
继承自Exception类,就变成了Checked Exception
继承自RuntimeException,就变成了Unchecked Exception(除了RuntimeException类及其子类外,其他都是Checked Exception)
自定义异常的重点在于构造函数
可以调用父类Exception的message构造函数
可以自定义自己的成员变量
在程序中采用throw(注意不是throws)来主动抛出异常,相当于调用异常类的构造器
例如throw new MyException(参数列表)