Java 异常处理

来源:互联网 发布:java带毫秒 编辑:程序博客网 时间:2024/06/06 03:44

       Java将异常分为两种,Checked异常和Runtime异常,Java认为Checked异常都是可以在编译阶段被处理的异常,所以它强制程序处理所有的Checked异常;而Runtime异常则无须处理。而Java的异常机制主要解决的就是Runtime异常。

       Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字,其中try关键字后紧跟一个花括号扩起来的代码块(花括号不能省略),简称try块,它里面放置可能引发异常的代码。catch后对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块。多个catch块后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。throws关键字主要在方法签名中使用,用于声明该方法可能抛出异常;而throw用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常对象。


异常处理机制

       Java的异常处理截止可以让程序具有较好的容错性,让程序更加健壮。当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”与“错误处理代码”分离,提供更好的可读性。当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给该catch快处理,这个过程被称为捕获(catch)异常;如果Java运行环境找不到捕获异常的catch块,则运行环境终止,程序也将退出。


当Java运行时环境接收到异常对象时,如何为该异常对象寻找catch块?

        当Java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类或其子类的实例,如果是,Java运行时环境将调用该catch块来处理该异常;否则再次拿该异常对象和下一个catch块里的异常类进行比较。


Java提供了丰富的异常类,这些异常类之间有严格的继承关系,图10.2显示了Java常见的异常类之间的继承关系。


          从图10.2中可以看出,Java把所有的非正常情况分成两种:异常(Exception)和错误(Error),它们都继承Throwable父类。

         Error错误,一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等,这些错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。

        如果程序运行时出现其他一些无法预知的错误,但是可以知道该异常对象总是Exception类或其子类的实例,我们可以调用Exception对应的catch块来处理异常。PS:程序总是把对应Exception类的catch块放在最后,因为如果把Exception类对应的catch块排在其他catch块的前面,Java运行时将直接进入该catch块(因为所有的异常对象都是Exception或其子类的实例),而排在它后面的catch块将永远也不会获得执行的机会。异常捕获时,先捕获小异常,再捕获大异常。

        同一个catch块中捕获多种类型的异常时,多种异常类型之间用竖线( | )隔开。


访问异常信息

        如果程序需要在catch块中访问异常对象的相关信息,则可以通过访问catch块的后异常形参来获得。

         所有的异常对象都包含了如下几个常用方法:

        1)getMessage():返回该异常的详细描述字符串。

        2)printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。

        3)printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流

       4)getStackTrace():返回该异常的跟踪栈信息。



使用finally回收资源

        程序在try块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须在finally中显示回收。Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收内存中对象所占用的内存。不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块还是会被执行。完整的Java异常处理语法结果如下:


 Java7的自动关闭资源的try语句      

      Java7增强了try语句的功能——它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源,此处的资源指的是那些必须在程序结束时显式关闭的资源(比如数据库连接、网络连接等),try语句在该语句结束时自动关闭这些资源。



使用throws声明抛出异常

        使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理:如果main方法也不知道如何去处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是,打印异常的跟踪栈信息,并终止程序运行。throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常,多个异常类之间以逗号隔开。一旦使用throws语句声明抛出该异常,程序就无须使用try...catch块来捕获该异常了。



使用throw抛出异常

       Java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成。


建议只有对外部的,不确定和预知的运行错误才使用异常。

原创粉丝点击