异常继承图
可以看出,所有的异常都继承自Throwable,Throwable的两个子类分为Error和Exception.
Error:就是错误,无法捕捉,是程序无法处理的,如OutOfMemoryError.
Exception:
- RuntimeException:运行时异常,发生在运行期,可以使用try catch来处理,如果不捕获,JVM会自动处理.比如:ClassCastException(类型转换异常),ArithmeticException(算术异常),IlleegalArgumentException(不合法参数异常),IndexOutOfBoudsException(数组越界异常),NullPointerException(空指针异常)等等
- CheckedException:编译时异常,必须使用throws语句(或try catch)在方法上或者是构造函数上声明.例如:IOException等.
Error类或者RuntimeException类的所有异常称为非受查异常,所有其他的异常称为受查异常.
捕获异常:
try{
有可能出现异常的语句
}{
catch(异常类型 异常对象){
....
}
finally{
异常的出口
}
}
- try代码块中放的是可能出现异常的代码.
- catch代码块中放的是出现异常后的处理措施
- finally代码块中用于处理善后工作,会在最后执行(并且如果有finally那么一定会执行)
- 其中catch和finally都可以根据实际情况选择加或者不加.
异常处理流程:
- 程序先执行try中的代码
- 如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配
- 如果找到匹配的异常类型,就会执行catch中的代码
- 如果没有找到匹配的异常类型,就会将异常向上传递给上层调用者
- 无论是否找到匹配的异常类型,finally中的代码都会被执行
- 如果上层调用者也处理不了异常,那么就继续向上传递
- 一直到main方法也没找到合适的代码处理异常,就会交给JVM进行处理,此时程序会异常终止
当然,有时候我们需要根据实际情况来抛出需要的异常,这时我们可以使用throws关键字手动抛出一个异常:
public class MyException {
public static void