JavaSE--异常机制
异常就是程序在运行时出现的不正常情况。发生在运行时期,java程序在运行时期发生的不正常情况,此时java就按照面向对象的思想对不正常现象进行描述和对象的封装。异常的由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。异常其实就是java对不正常情况进行描述后的对象体现。
一、异常体系
Thorwable是所有异常的基类,按异常发生场所可分为Error和Exception两种:
- 对于严重的,java通过Error类进行描述(通常出现重大问题如:运行的类不存在或者内存溢出等)。对于Error一般不编写针对性的代码对其进行处理。Error是由系统底层发生的,它将告诉JVM,JVM告诉使用者。Error一旦出现不做针对性的处理,直接修改代码。
- 对于非严重的,java通过Exception类进行描述。异常由JVM发生的,并告诉调用者,对于Exception可以使用针对性的处理方式进行处理。
按异常的捕获与处理状态可分为checked exception(受查异常)与unchecked exception(非受查异常):
- checked exception(受查异常),也称非运行时异常(运行时异常以外的异常就是非运行时异常),由代码能力之外的因素导致的运行时错误。java编译器强制程序员必须进行捕获处理,比如常见的有IOExeption和SQLException。如果不进行捕获或者抛出声明处理,编译都不会通过
- unchecked exception(非受查异常),包括Error和RuntimeException,比如常见的NullPointerException、IndexOutOfBoundsException。对于RuntimeException,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
按照运行时异常与非运行时异常划分:
- 典型的RuntimeException包括NullPointerException、IndexOutOfBoundsException、IllegalArgumentException等。
- 典型的非RuntimeException包括IOException、SQLException等。
二、异常处理
1.捕获异常
捕获机制:try-catch-finally(1-n-1/1-0-1/1-n-0)
- try{}语句块:里面是要检测的Java代码,可能会抛出异常,也可能会正常运行。
- catch(异常类型){}块:是当Java运行时,系统接收到try块中所抛出异常对象时,会寻找能处理这一异常catch块来进行处理,注意异常类型需要与try{}语句块可能抛出的异常要匹配。可以有多个catch块。不同的异常类型对应不同的处理代码。
- finally{}语句块:不管系统有没有抛出异常,都会去执行,一般用来释放资源。除了在之前执行了System.exit(0)
2.抛出异常
抛出机制:throw,throws
- throws:用在函数上,后面跟的是异常类,可以跟多个;用来声明异常,让调用者知道该功能可能出现的问题,并有调用者可以给出预先的处理方式
- throw:用在函数内,后面跟的是异常对象;抛出具体问题对象,执行到throw功能就已经结束,跳转到调用者,将具体的问题对象也抛给了调用者
- 抛出原则:功能内部有异常抛出,那么功能上一定要声明,内部抛什么功能上就要声明什么,声明的目的就是为了让调用者处理,如果调用者不处理则编译失败!
- 特殊情况:当函数内通过throw抛出了RuntimeException及其子类的异常对象时,函数上可以不进行声明异常类!不声明的目的就是不让调用者处理,让调用者的程序停止。抛出异常不声明则发生异常时程序会停止,若是声明异常调用者则可以对异常进行捕获并加以处理然后程序可以继续运行,此时需要注意异常处理要得当不能影响后面代码的运行
科学搬砖,勤劳致富