一、Java异常机制
1.主要依赖于5个关键字:try/catch/finally/throw/throws。
2.异常机制使代码拥有更好的容错性。当程序运行出现意外情况时,系统会自动生成一个Exception对象来通知程序,从而实现“业务逻辑代码”和“错误处理代码”分离。
二、try、catch、finally代码块
//异常处理语法结构中,只有try块是必须的
try{
//业务实现代码
...
}catch(Exception e){
//处理对应异常
...
}finally{
//资源回收
...
}
抛出异常:如果try块中出现异常,系统自动生成一个异常对象。
捕获(catch)异常:Java运行时环境寻找能处理该异常对象的catch块,如能找到,则交给对应catch块处理。否则,运行时环境终止,Java程序退出。
异常机制确保finally块总会被执行。即使try块或catch块中执行了return。
三、异常继承体系
Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承自Throwable父类。
Error:一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败。通常应用程序无法处理。
四、Checked异常和Runtime异常体系
Java异常被分为两大类:Checked异常和Runtime异常。所有RuntimeException类及其子类的实例称为Runtime异常。不是RuntimeException类及其子类的实例则称为Checked异常。
1 Checked异常
Java认为Checked异常都可以被处理,所以Java程序必须显示处理它,否则该程序在编译时就会发生错误,无法通过编译。(例如SQLException和IOException)
有两种处理方式:
- 使用try/catch代码块处理
- 在定义方法时声明抛出该异常
2 Runtime异常
Runtime异常无须显示声明抛出,如需要可使用try/catch处理。
常见的有:NullPointerException(空指针异常)、ArithmeticException(算术异常)、IndexOutOfBoundsException(越界异常)、NumberFormatException(数字格式异常)、ClassNotFoundException(找不到类异常)
五、Throw和Throws
1 Throws
Throws关键字在方法签名中使用,用于声明该方法可能抛出的异常。由上一级调用者处理。
方法重写时,Throws的限制:子类方法声明抛出的异常应是父类方法声明抛出的异常的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。
2 Throw
Throw用于抛出一个具体的异常对象
六、自定义异常类
用户自定义异常都应该继承Exception基类,如果希望定义Runtime异常,则应该继承RuntimeException基类。需要提供两个构造器
- 无参数的构造器
- 带一个字符串参数的构造器,该字符串作为该异常对象的描述信息。