合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 泛型异常 由于擦除的原因,**catch** 语句不能捕获泛型类型的异常,因为在编译期和运行时都必须知道异常的确切类型。泛型类也不能直接或间接继承自 **Throwable**(这将进一步阻止你去定义不能捕获的泛型异常)。 但是,类型参数可能会在一个方法的 **throws** 子句中用到。这使得你可以编写随检查型异常类型变化的泛型代码: ```java // generics/ThrowGenericException.java import java.util.*; interface Processor<T, E extends Exception> { void process(List<T> resultCollector) throws E; } class ProcessRunner<T, E extends Exception> extends ArrayList<Processor<T, E>> { List<T> processAll() throws E { List<T> resultCollector = new ArrayList<>(); 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; @Override public void process(List<String> resultCollector) throws 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; @Override public void process(List<Integer> resultCollector) throws 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<>(); for(int i = 0; i < 3; i++) runner.add(new Processor1()); try { System.out.println(runner.processAll()); } catch(Failure1 e) { System.out.println(e); } ProcessRunner<Integer, Failure2> runner2 = new ProcessRunner<>(); for(int i = 0; i < 3; i++) runner2.add(new Processor2()); try { System.out.println(runner2.processAll()); } catch(Failure2 e) { System.out.println(e); } } } /* Output: [Hep!, Hep!, Ho!] Failure2 */ ``` **Processor** 执行 `process()` 方法,并且可能会抛出具有类型 **E** 的异常。`process()` 的结果存储在 `List<T>resultCollector` 中(这被称为*收集参数*)。**ProcessRunner** 有一个 `processAll()` 方法,它会在所持有的每个 **Process** 对象执行,并返回 **resultCollector** 。 如果不能参数化所抛出的异常,那么由于检查型异常的缘故,将不能编写出这种泛化的代码。