异常的概念
异常时程序在运行期发生的不正常的事件,会打断正常的执行流程。
设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。
异常的处理机制
1)Java程序在执行过程中出现异常会自动生成一个异常类对象,之后被自动提交给JVM,这个过程称为抛出(throw)异常。
2)当jvm收到异常对象时,会寻找能处理这一异常的代码并交其处理。这一过程为捕获异常和处理异常。
3)如果JVM找不到捕获异常的代码,则运行时系统将终止,相应的Java程序也将退出。
异常的分类
异常的两类
Error:错误
Java程序运行过程中所发生的异常事件从严重性可分为两类。
错误(Error):JVM系统内部错误或资源耗尽等严重情况属于JVM需要负担的责任。
这一类异常事件无法恢复或不可能捕获,将导致应用程序中断。
异常(Exception):其他因编程错误或偶然的外在因素导致的一般性问题。这类异常得到恰当的处理时,程序有机会恢复正常运行状况。
程序员只能处理异常(Exception),而对(Error)无能为力。
自定义异常 继承 Exception。
从编程角度分
非受检(unchecked)异常:编译器不要求强制处置异常。
—一般是指编程时的逻辑错误,是程序员可以避免
——java.lang.RuntimeException及子类都是非受检异常:
——错误的类型转换:java.lang.ClassCastException
——数组下标越界:java.lang.ArrayindexOutOfBuondsException
——空指针异常:java.lang.NullPointerException
——算术异常(除0溢出):java.lang.ArithmeticException
受检(checked)异常:编译器要求必须处置的异常。指的是程序在运行时由于外界因素造成的一般性异常。
——没有找到指定名称的类:java.lang.ClassNotFoundException
——访问不存在的文件:java.io.FileNotFoundException
——操作文件时发生的异常:java.io.IOEception
——操作数据库时发生的异常:java.sql.SQLException
异常的捕获和处理
1、try{…}监控的作用语句包含了一段可能会产生异常的代码的范围,后面的catch语句对异常做出的相应处理。在这段代码中所产生异常对象与catch语句分别相对应,并处理。
2、catch语句后只声明一种其能处理的特定类型的异常。只要写出这样的语句,由JVM去处理。
在catch语句中声明的异常对象(catch(ExceptionName e))封装了异常事件发生的信息。可以使用对象方法获得异常信息:
getMessage()方法,用来获得有关异常事件的字符串信息
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容。
使用多重catch语句时,异常子类一定位于异常父类之前。父类范围大于子类,子类放前才能给起到作用。
如果没有异常产生,所有的catch段代码都会被忽略执行。
3、finally段的代码无论是否发生异常都执行。
finally语句可以单独和try匹配使用,当try、catch、finally三者组合使用时,finally放至最后。
通常,在finally语句块中进行资源的清理工作:
关闭打开的文件、删除临时文件、关闭数据库连接
4、使用throw和throws
1)throw用在方法代码中主动产生受检异常或非受检异常,用在方法体中,单独使用,没有意义。
2)throws用来抛出异常。throws用在方法名的后面 throws 异常类型{} ,throw与throws配合使用,throw产生异常,throws抛出throw的异常。同常用来调用这个方法时解决这个异常才可以调用。
3)受检异常使用throw会立马报错,编译器不要求强制处理的异常,非受检异常用throw时可以正常编译。
自动捕获异常
自定义异常,继承Exception或其子类,包装一下父类的构造方法。显示字体中文!