java中的异常处理

来源:互联网 发布:电信2g网络和4g络区别 编辑:程序博客网 时间:2024/06/07 08:00
1、异常的分类
①异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。 
②Error用来表示我们不用关心的编译期和系统错误(除了特殊情况),Exception是可以被抛出的基本类型,在java类库、用户方法及运行时故障中都可能抛出Exception异常。RuntimeException是由java虚拟机抛出,一般无需自己去捕获,会被自动获。所以它们也可以被称为未被检查的异常。
2、异常链
当我们想在捕获一个异常之后再抛出另一个异常,而且想要保留原始异常的信息,这就被称为异常链(Exceptionchaining)。Throwable的子类在构造器中都可以接受一个cause对象作为参数,这个cause就表示原始异常,这样即使我们在当前位置发生了异常,也能通过这个异常链追踪到异常最初发生的地方。在Throwable的子类中,只有三种基本异常类提供了带cause的构造器。它们是error,Exception,RuntimeException。而且,它们都提供了initCause方法。(参考,java编程思想)
eg:

package txts;

 

public classTestCause {

   

   public static void f(){

       throw newNullPointerException();

   }

   

   public static voidmain(String[] args) {

       try{

           f();

       }catch(NullPointerException n){

       

           try{

               Exception3 e1=new Exception3();

               e1.initCause(n);

               //或者

               //Exception3 e1=new Exception3(n);

               throw e1;

           }catch(Exception3 e){

               //打印出从异常发生起始的位置到发生的位置

               e.printStackTrace();

               //输出通过cause对象保存的异常信息

               //System.out.println(e.getCause());

           }

       }

       

   }

   

}

class Exception3 extends Exception{

   

   Exception3(){

   }

   Exception3(Throwable cause){

       super(cause);

   }

}

 


 output:txts.Exception3

    attxts.TestCause.main(TestCause.java:15)

Caused by: java.lang.NullPointerException

    attxts.TestCause.f(TestCause.java:6)

    attxts.TestCause.main(TestCause.java:11)


3、异常的限制
重载和重写都是多态的表现形式。其中,重写是体现在继承关系之中。当子类要重写父类的方法,而且这个方法有抛出异常的时候,我们必须遵循以下规则:
a、子类重写的方法可以不抛出异常
b、子类重写的方法可以抛出运行时异常
c、子类重写的方法可以抛出不大于父类方法的异常范围的异常,即可以抛出跟父类方法一致的异常,或者抛出父类方法异常的子异常。试想,假如子类能抛出大于父类方法异常范围的异常,那么当父类的引用指向子类的对象时,再用父类的引用去调用相关的方法,那么父类将捕捉不到子类的异常,程序看起来正确,但却可能抛出了不受控制的异常,这样的结果不是我们想要的,也违背了面向对象的基本原理。
   当一个类在继承某个类的同时还实现了某个接口,而恰好它要重写的方法在父类和接口中都有存在,而且这个方法在父类和接口中抛出了不同的异常,这时,根据上述规则,子类在重写这个方法时,则只能不抛异常或者抛出运行时异常,而不能抛出父类或者接口中的任何一个异常,也不能同时抛出两个异常。
  但注意,异常限制对构造器不限制,子类的构造器可以抛出任何异常。


0 0
原创粉丝点击