1.异常概述:
异常:指程序在执行过程中,出现的非正常情况,最终导致JVM非正常停止。
- Error:严重错误问题,无法处理的错误,只能事先避免,比如内存溢出。
- Exception:称为异常类,它表示程序本身可以处理的问题,比如数组下标越界。
2.异常分类:
- 编译时异常也称为检查异常,必须显示处理,否则程序就会发生错误,无法通过编译。
- 运行时异常也称为非检查异常,无需显示处理,也可以和编译时异常一样处理。RuntimeException所有的类及其子类称为运行时异常,其他的异常都是编译时异常。
RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码。
非RuntimeException:编译期就必须处理的,否则程序就不能通过编译,就更不能正常运行了。
3.异常处理机制:
- 当程序抛出一个异常后,从程序中导致异常的代码处跳出,Java虚拟机检测寻找和try关键字匹配的处理该异常的catch块。
- 如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。
- 如果没有找到处理该异常的catch块,最终运行时报错。
格式:
try{ 可能出现异常的代码块; } catch(异常名 变量名){ 异常的处理代码; }
执行流程:
- 程序从try里面的代码开始执行
- 出现异常,回自动生成一个异常类对象,该异常对象将提交给Java运行时系统
- 当运行时系统接收到异常对象时,回到catch中去找匹配的异常类,找到之后会进行异常的处理
- 执行完毕之后,程序还可以继续往下执行
异常处理可以有多个catch:
- 每个try语句块可以伴随一个或者多个catch语句,用于处理可能产生的不同类型的异常
- 捕获的异常类型由上至下的捕获异常类型的顺序应该是子类到父类
try{ 可能出现异常的代码; } catch(NullPointException e){ ...... } catch(RunException e){ ...... } catch(Exception e){ ...... }
子类型异常在前,父类型异常在后,这样的顺序依次捕获,否则编译不通过!!!
Finally:
- finlly语句为异常处理提供的一个统一的出口,使得在控制流程到程序其他部分之前,能够对程序的状态作统一管理。
- 无论try所指的程序块中是否抛出异常,finally所指定的代码都要被执行
- 通常finally在语句中可以进行资源的释放工作,如关闭打开的文件,关闭数据库连接等
try{ 可能出现异常的代码块; }Catch(异常名 变量名){ 异常的处理代码; }finally{ 必须执行的代码; }