异常分类
Error与Exception都继承自Throwable类
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Error表明系统JVM已经处于不可恢复的崩溃状态中。我们不需要管它。
Exception是程序本身能够处理的异常,如:空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)等。
Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。通常Java的异常可分为:
1. RuntimeException 运行时异常
2. CheckedException 已检查异常
派生于RuntimeException的异常,如被 0 除、数组下标越界、空指针等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。
所有不是RuntimeException的异常,统称为Checked Exception,又被称为“已检查异常”,如IOException、SQLException等以及用户自定义的Exception异常。这类异常在编译时就必须做出处理,否则无法通过编译。
自定义异常
在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类
从Exception类或者其他的子类派生一个子类即可。
习惯上,定义的类应该包含2个构造器:一个是默认构造器,另一个是带有详细信息的构造器。
异常处理
Java的异常处理通常是通过5个关键字来实现:try、catch、finally、throws、throw
try-catch
情况1:try块中没有出现异常
不执行catch块代码,执行catch后边的代码
情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类)
执行catch块代码,执行catch后面代码
情况3:try块中代码出现异常,catch中异常类型不匹配
不执行catch块代码,不执行catch块后边的代码,程序会中断执行
注意:
出现异常后,Java会生成相应的异常对象,Java系统匹配的catch块,找到后将异常对象付给catch块异常参数
出现异常后,try块中尚未执行的语句不会执行
出现异常后并处理,catch后面的语句还会执行
Catch块中如何处理异常:
1.输出用户自定义异常信息
2.调用异常对象的方法输出异常信息
printStackTrace()
3.继续向上抛
throw e
try-catch-finally
在try-catch块后加finally块,可以确保无论是否发生异常,finally块中的代码总能被执行
无异常:try-finally
有异常:try-catch-finally
通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等
finally块的具体执行过程
1、执行try或catch中代码
2、遇到return/throw,先执行finally中语句块
3、执行return/throw
多重catch
一段代码可能会引发多种类型的异常
当异常发生时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句,执行其中一条catch语句后,其后catch语句后,其后catch语句将被忽略
在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后在逐一细化,即先子类后父类。
声明异常throws
当Checked Exception 产生时,不一定立刻处理它,可以再把异常throws出去
如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开
子类声明的异常范围不能超过父类声明范围
父类没有声明异常,子类也不能
不可抛出原有方法抛出异常类的父类或上层类
手动抛出异常throw
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可以根据需要手工创建并抛出
在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做,
也可以由JRE来实现,但是他们调用的都是throw句子。
注意抛出运行时异常和Checked异常的区别
1、抛出Checked异常,该throw语句要么处于try块中,要么方法前面中有throws抛出
2、抛出运行时异常,没有以上要求
总结
五个关键字(try、catch、finally、throws、throw)
先逮小的,再逮大的
自定义异常