java异常

来源:互联网 发布:故宫软件 编辑:程序博客网 时间:2024/05/17 16:56

    在java中,异常并不只是错误,它其实是指一种不正常,不寻常的一种现象,这些现象并不一定会产生错误。

    下面是java异常的类结构图:

                                                          

                                                                    

                                                                   

      如图中所示,java中的基本类是Object,所有异常类型都是内置类Throwable的子类。Throwable的直接子类有Error和Exception两个,以Error为父类所产生的下属类均为java虚拟机生成并抛出,这是我们无法处理的异常。而Exception类对象是由应用程序处理或抛出,该部分分为RuntimeException和非RuntimeException类异常,RuntimeException及其下属类的异常是运行时产生的异常情况,可处理也可不处理,但非RuntimeException的另一部分为编译时异常,该异常必须处理。

          下面是几种常见异常情况:

                  

                   

         如果抛出的异常是Error和RuntimeException类型之外的其他异常,就必须进行相关处理:

          1.在相关的方法中提供所需代码来直接处理异常

          2. 不去理会,在抛出异常代码的方法把这个异常向上抛出给该方法的调用代码。也就是说,自己不处理,将该异常的处理交给其他可处理程序进行处理。

    异常实际上是由方法抛出的,异常处理的关键字位try,catch,finally。

          try代码块:包含的是可能引起一个或者多个异常的代码。

          catch代码块:包含着计划用于处理一个特定类型异常的代码。

          finally代码块:在方法结束之前必需执行的代码。

     当然在抛出异常时经常也用到throw和throws,throw是在catch块中,意思是将捕获的异常向上抛出,此时最常规,最规范的代码书写应该是throws在该异常代码的函数声明后面,并且抛出的异常类型一般不能变。而在外面如main中,我们进行捕获处理。这里要说明的一点是,如果有finally块,那么在执行throw之前,会先执行finally中的代码,再抛出异常。代码如下:

          public class  mytest{

                public static void main(){

                          Test t1=new Test();

                          try{

                                    t1.test1();

                              }catch(ArithmeticException e){

                                    println("ArithmeticException  error");

                              }

                }

         }

         class Test{

                  public void  Test1() throws ArithmeticException {        

                            try{

                                   system.out.println(10/0);

                              }catch(ArithmeticException e){

                                    throw e;

                              }finally{

                                     println("程序结束");

                              }

                  }

        }

        但在实际编码中,我们还可能遇到以下情况:

         1. 在函数Test1的方法声明后面不加throws,方法体里依然throw,外部main中依然try,catch,这也是可以的,但条件是抛出的该异常为运行时异常,这时,我们可以在main中捕获或者不捕获异常。

         2. 对于编译时异常,在函数Test1的方法声明后面不加throws,方法体里也没有throw,外部main中依然try,catch,这也是可以的。

         3. 在编码时,异常的类型可以向上升高异常类型。

         4. 在一些情况下,我们也可以catch一种异常,而抛出另一种异常。