一.程序
所谓程序就是各种命令的集合
二.异常
异常就是在程序运行时发生的不正常的时间,打断程序运行的流程
目的:
学习异常就是为了能够利用异常做出良好的应用程序(所谓的良好的应用程序,就是不能因为异常,导致整个应用程序无法使用)
注意:Java本身就提供了处理异常的能力,学习异常就是学习如何利用这种能力,帮我们解决开发中异常的问题
【异常处理机制】
Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该异常类对象将被自动提交给JVM,这个过程称为抛出异常
当JVM接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常和处理异常,如果JVM找不到可以捕获异常的代码,则运行时系统将停止,相应的Java程序也将退出
三.异常的分类
1.根据严重程度
错误(Error):这个级别的异常代码是无能为力,必须通过手动方式解决
例如:JVM内部出错或CPU资源耗尽
异常:(Exception):一般指的是编程过程中出现的一般性问题
例如:除数为0,数组下标越界
注意:
Java程序员只能处理Exception,对Error无能为力
2.Exception根据编程划分:
受检异常:就是在编译期间就要处理的异常(javac)
非受检异常:在运行期间需要处理的异常(Java)
Java.lang.RuntimeException类以及子类都属于非受检异常
3.Error和Exception的共同父类是Throwable
四.try和catch
try{ …… }语句包含了一段代码,这段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理
在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象
在catch中声明的异常对象(catch(ExceptionName e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。例如:
getMessage()方法,用来获得有关异常事件的字符串信息
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容
使用多重catch语句时,异常子类一定要位于异常父类之前
如果没有异常产生,所有的catch段的代码都会被忽略不执行
五.finally
finally中的代码主要用来进行资源清理的工作
无论try语句块中是否有异常发生,位于finally中的代码都会被执行
六.throw和throws
throw关键字用在方法代码中主动产生一个异常
如果方法代码中自行抛出的异常是受检异常,则这个方法要用throws关键字声明这个异常
throws用来声明一个方法可能会抛出的所用异常。跟在方法签名的后 面。如果一个方法声明的是受检异常,则在调用这个方法之处必须处置这个异常(谁调用处理)
显示捕获这个异常,继续用throws向上声明
注:重写一个方法时,它所声明的异常范围不能被扩大
七.自定义异常
自定义异常:当需要一些跟特定业务相关的异常信息类时,可以继承Exception来定义一个受检异常。也 可以继承自RuntimeException或其子类来定义一个非受检异常
八.异常实践
观察抛出的异常的名字和行号跟重要
应该捕获和处理那些已知如何处理的异常,传递那些不知如何处理的异常
尽量减少try语句块的体积
for(int i=1;i<=1000;i++){
try{
…
}catch(…)
}不合理
尽量减少try-catch语句的嵌套
在catch块代码段中,应该打印出该异常的堆栈跟踪信息以方便调试
九.【JDK 7新增的特性】
在Java 7以前,每个catch块中只能捕捉一个异常。从Java 7开始,一个catch块可以捕捉多个异常。
语法:
catch(异常1 | 异常2 | 异常3 ex)
{
}多个异常之间用竖线隔开