1.Java异常处理机制
(1)使用try…catch捕获异常
当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给catch块处理,这个过程称为捕获(catch)异常。
(2)try块里声明的变量是代码块内局部变量,它只在try块内有效,在catch块内不能访问。
(3)Java把所有非正常情况分为两种:异常(Exception)和错误(Error)。 它们都继承Throwable父类。Error错误,一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。
(4)异常捕获时,先捕获小异常,再捕获大异常。
(5)捕获多种异常时,异常变量用隐式的final修饰,但捕获一种类型异常,则不用final修饰。
(6)访问异常信息:(常用方法)
getMessae():返回异常的详细描述字符串
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出
getStackTrace():返回该异常的跟踪栈信息
(7)使用finally回收资源:Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用的内存。一般finally处于catch块之后,系统一定会执行finally代码块。除非在异常代码中使用System.exit(1)语句退出虚拟机。
(8)当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或者throw块,,方法终止;如果有finally块,系统立即开始执行finally块,只有当finally块里也使用了return或者throw等导致方法终止的语句,finally块已经终止了方法,系统将不会跳回去执行try块、catch块中的代码。
(9)异常处理嵌套:在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源(必须在程序结束时显示关闭的资源)
2.Checked异常和Runtime异常体系
所有的RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例则被称为Checked异常。
(1)使用throws声明抛出异常:当前方法不知道如何处理这种类型的异常,该异常由上一级调用者处理。
(2)Throws声明抛出只在方法签名中使用并可以抛出多个异常类。如:
public static void main(String[] args) throws IOException
{…}
(3)方法重写时子类方法抛出的异常不能比父类方法更大的异常
3.使用throw抛出异常
如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显式捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理;如果throw抛出Runtime异常,则该语句无须放在try块里,也无须放在带throws声明抛出的方法中,程序既可以显式使用try…catch来捕获并处理该异常,也可以不用理会直接交给该方法调用者处理。
4.异常链
层与层之间有非常清晰的划分,上层功能的实现严格依赖于下层的API,也不会跨层访问。
把原始异常信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,符合面向对象的封装原则。