Java中异常的基础学习
异常
一、释义:
程序非正常终止运行的现象。一般是由非法数据造成的。
java.lang.Throwable:
Throwable 类是 Java 语言中所有错误或异常的超类。
java.lang.Error: 严重的错误,程序本身无法解决的问题,遇到这样的问题只能终止程序。
java.lang.Exception: 该类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
二、异常的分类
-
编译时期异常: Exception 包含下面的所有子类(RuntimeException 除外) ,编译时检查,一定要处理,在java程序中,对异常的处理有3种方式:抛出、声明、捕获。
-
运行时期异常: RuntimeException 及其子类。运行时检测,可以不用处理
三、异常抛出
解释:在程序设计中,我们必须要考虑程序中有可能出现的各种情况。所有的功能需求都是由方法实现的,而方法中有时需要处理方法调用者传递的实参数据。在对数据处理之前,我们首先要做的是对数据的合法性判断(强壮性判断)。如果传递的实参数据不合法,就应该告诉方法的调用者数据异常的相关情况。
异常抛出关键字: throw
语法格式:throw new 异常类对象("描述异常的信息");
注意事项:
-
throw 抛出的对象必须是异常体系的。
-
throw 关键字只能写在方法中。
-
throw 会发生程序的终止,下面不能写其他语句
-
不管是程序本身还是程序员手动抛出的异常,JVM的处理方式是一样。终止程序,打印异常信息。
四、自定义异常
描述:程序员在开发中根据业务需求自己定义的异常类。
自定义异常的注意点:
- 继承 Throwable,才能通过 throw 语句抛出。
1.1 Exception 编译时期异常。一般抛出编译时期异常。
1.2 RuntimeException 运行时期异常。
- 自定义的异常类中只需要提供一个空参以及一个信息提示的构造即可。
五、声明异常
描述:将异常交由上层调用者处理,属于踢皮球的行为
声明的位置:method() throws 异常类型,异常类型... {}
注意事项:
-
当方法上声明了异常时,方法的调用者在调用方法时需要对异常进行处理(继续声明,捕获)。
-
如果方法的上层调用者对异常依然无法处理时,可以继续使用throws关键字声明异常继续抛出,但是最终要有能够处理异常的调用者。
-
子类重写父类的方法时,如果父类的方法上没有声明异常,子类也不可以声明,只能捕获;如果父类的方法上有声明异常,子类可以声明,也可以不声明。
六、捕获异常
描述:能够明确异常的处理时需要捕获,捕获到异常之后,我们可以自定义处理异常,而不是直接结束程序。
try-catch代码块语法格式:
try{
可能发生异常的代码;
}catch (异常类型 变量名 ) {
捕获并处理发生的异常;
}catch (异常类型 变量名 ) {
捕获并处理发生的异常;
}....
try关键字后面的一对{}将可能发生异常的代码封装起来,称为:监控区域。在运行try代码块时,一旦发生异常,则catch代码块负责捕获异常,并对异常进行自定义的处理。而catch()中的变量是为了保存throw关键字抛出的异常对象。
捕获异常的原则和注意事项:
-
如果能够明确当前异常如何处理时,再进行捕获,否则继续声明,由上层调用者捕获处理。
-
当try语句中没有发生异常时,try语句中的代码会逐一被执行,程序将跳过catch语句,继续执行后续的代码。
-
一旦try语句中发生异常,则将发生语句的跳转,try语句中异常下面的代码不会再被执行,而是进入对应的catch语句处理异常。当catch语句执行结束就表示整个try-catch语句结束。
-
如果有多个catch语句,并且抛出的多个异常之间有继承关系,那么应该优先捕获子类异常。如果优先捕获父类异常的话,父类的异常类型可以以多态的方式捕获到所有的子类异常类型。
-
如果多个catch捕获的异常之间有继承关系,也可以只捕获父类异常。
-
JDK1.7时对异常的捕获进行了优化的处理,可以使用一个catch语句捕获多个异常:
七 、finally代码块
描述:有些时候,程序在try代码块里会打开一些物理资源(如:数据库连接,网络连接,硬盘文件),这些物理资源在操作之后都需要关闭连接释放资源。但是在try代码块中是有可能发生异常的,而一旦发生异常,就会跳转到catch语句,造成try代码块中释放资源的代码无法继续执行。如果希望即使发生了异常,也能够让某些代码继续运行 ,可以使用finally代码块,它需要结合try语句一起使用。简单来说finally语句表示无论是否出现异常,都应当执行的内容。一般用在方法结束前或者发生异常时做一些资源释放的操作。
finally语法格式:
try {
有可能发生异常的代码;
} catch ( Exception e ) {
捕获并处理发生的异常;
}finally {
无论发生异常都会执行的代码;//不管执行try还是catch最终都会执行finally
}
注意事项:finally返回值问题
因为finally代码块无论是否发生异常都会执行,所以要尽量避免在finally中使用return返回结果,因为最后返回的一定是finally语句中的结果。
try-finally语句
try {
java代码;
} finally {
无论是否发生异常都执行的代码;
}
这个try-finally语句不是用来捕获异常的,作为代替它常常用来释放系统资源。
注意:finally代码块并不是百分百会被执行,发生如下4种情况,finally代码块就不会执行。
-
在finally代码块中发生了异常。
-
在执行finally代码块之前执行了System.exit()退出JVM虚拟机。
-
程序所在的线程死亡。
-
关闭CPU。
浙公网安备 33010602011771号