异常基本概念:用名字代表发生的问题,并且异常的名称容易理解。
异常处理是Java中唯一正式的错误报告机制。
想要构建大型,健壮,可维护的程序,需要用强制的形式消除错误处理过程中的随心所欲的因素。故出现异常处理机制。好处是降低错误处理代码的复杂度。
为什么需要异常处理?
答:在没有异常处理的程序中就必须使用判断语句,配合所想到的错误状况来捕捉程序中所有可能的错误。但为了捕捉这些错误,需要编写大量的判断语句,有可能还未必捕捉到所有错误,势必会降低程序运行效率。Java异常正好改进,易于使用,可自行定义异常类,处理抛出的异常同时又不会降低程序运行效率。
自定义异常
必须从已有的异常类继承,最好是选择意思相近的异常类继承。建立新的异常类型最简单的方法就是让编译器产生默认构造器。
异常说明
异常说明以礼貌的方式告知客户端程序员某个方法可能会抛出异常类型。使用关键字throws,后面跟所有潜在异常类型的列表。
被检查的异常:在编译时被强制检查的异常。
Throwable
Throwable是捕获异常类型的基类Exception的基类。调用栈轨迹printStackTrace,调用栈显式了“异常抛出点”的方法调用序列。有版本:输出到标准错误;版本:输出到流。
栈轨迹
printStackTrace方法提供的信息可以通过getStackTrace方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素都表示栈中的一帧。栈顶:调用序列中的最后一个方法调用,栈底:调用序列中的第一个方法调用。
异常链
在捕获一个异常后抛出一个另一个异常,并且把异常原始异常信息保存下来被称为异常链。
方法:所有Trowable的子类在构造器中都可以接受一个cause对象作为参数,cause用来表示原始异常,这样就可以将原始异常传递给新的异常,故即使在当前位置创建并抛出新异常,也可以通过异常链追溯到最初异常发生的地方。三种基本的异常类提供cause:Error(用来Java虚拟机报告系统错误),Exception以及RuntimeException。如果其他类型需要链接需要使用initCause方法。
Throwable对象分为:Error用来表示编译时和系统错误;Exception表示可以被抛出的基本类型,值得被关心,在Java类库,用户方法以及运行时故障都可能会抛出异常。
运行时异常RuntimeException:会自动被虚拟机抛出,不需要再异常说明中声明方法抛出运行时异常,也被称为“不受检查异常”。这种异常属于错误,被自动捕获,不需要手写代码去捕获。
注意:只能在代码中忽略RuntimeException以及子类类型的异常,其他类型异常的处理都是由编译器强制实施。RuntimeException代表编译错误:无法预料错误,作为程序员应该在代码中进行检查的错误,譬如数组索引超出范围,需要注意数组大小。
finally
用途:可以保证:无论try发生什么,内存总能被释放。
适用场景:把除了内存之外的资源恢复到初始状态。譬如:打开的文件,网络连接等。
return中的finally:在一个方法中尽管有多个点可以返回,但是可以保证重要的清理工作可以进行。
assert
断言:肯定某一个结果返回值是正确的,如果最终这个结果返回值是错误的会通过断言检查肯定会提示错误信息。assert 1==0 : "1不等0";
网友评论