泛型中的异常处理

来源:互联网 发布:域名与二级域名 编辑:程序博客网 时间:2024/06/06 19:47

      由于存在类型擦除,泛型中异常的处理受到限制。由于异常的类型必须在编译或运行时,确切知晓,否则,异常无法被捕获。泛型类型通常不能直接的或者间接的继承Throwable,这进一步阻止了你处理不能被捕获的异常。

      尽管如此,类型参数还是被用在方法声明的异常语句中的,他允许你通过检查类型信息来写泛型的代码

  interface Processor<T,E extends Exception>{

    void process(List<T> resultCollector) throw E;

}

   class ProcessRunner<T,E extends Exception> extends ArrayList<Processor<T,E>>{

    List<T> processAll() throw E{

        List<T> resultCollector = new ArrayList<T>();

        for(Processor<T,E> processor:this)

        processor.process(resultCollector);

        return resultCollector;

    }

}

   class Failure1 extends Exception{}

   class Processor1 implements Processor<String,Failure1>{

    static int count = 3;

    public void process(List<String> resultCollector) throw Failure1{

       if(count-->1){

        resultCollector.add("Hep");

     }else{

          resultCollector.add("Ho");

      }

       if(count<0)

         throw new Failure1();

    }

   }

    class Failure2 extends Exception{}

    class Processor2 implements Processor<Integer,Failure2>{

      static int count = 2;

      public void process(List<Integer> resultCollector)  throw Failure2{

        if(count-- == 0){

           resultCollector.add(47);

        }else{

           resultCollector.add(11);

        }

        if(count<0)

              throw new Failure2();

      }

   }

   public class ThrowGenericException{

      public static void main(String[] args){

        ProcessRunner<String,Failure1> runner = new ProcessRunner<String,Failure1>();

       for(int i=0;i<3;i++)

          runner.add(new Precessor1());

      try{

           System.out.println(runner.processAll());

        }catch(Failure1 e){

           System.out.println(e);

      }

      ProcessRunner<Integer,Failure2> runner2 = new ProcessRunner<Integer,Failure2>();

      for(int i=0;i<3;i++)

         runner2.add(new Proccesor2());

      try{

         System.out.println(runner2.processAll());

      }catch(Failure2 e){

         System.out.println(e);

      }

   } 

}

Processor类执行process()方法可能抛出exception E,process()的结果是存储数据到List<T> resultCollector(这也叫集合参数)。ProcessRunner有一个processAll方法可以执行每一个它所持有的对象,然后返回结果。如果你不能把抛出的异常参数化,由于异常检查机制你将不能够写泛型的异常处理代码。

原创粉丝点击