// generics/ThrowGenericException36.java // TIJ4 Chapter Generics, Exercise 36, page 713 // Add a second parameterized exception to the Processor class and // demonstrate that the exceptions can vary independently. import java.util.*; interface Processor { void process(List resultCollector) throws E,E2; } class ProcessRunner extends ArrayList> { List processAll() throws E,E2 { List resultCollector = new ArrayList(); for(Processor processor : this) processor.process(resultCollector); return resultCollector; } } class Failure1 extends Exception {} class Failure3 extends Exception {} class Processor1 implements Processor { static int count = 3; public void process(List resultCollector) throws Failure1, Failure3 { if(count-- > 1) resultCollector.add("Hep!"); else resultCollector.add("Ho!"); if(count < 0) throw new Failure1(); if(count < -1) throw new Failure3(); } } class Processor1b implements Processor { static int count = 3; public void process(List resultCollector) throws Failure1, Failure3 { if(count-- > 1) resultCollector.add("Hep!"); else resultCollector.add("Ho!"); if(count < 0) throw new Failure1(); if(count == 1) throw new Failure3(); } } class Failure2 extends Exception {} class Processor2 implements Processor { static int count = 2; public void process(List resultCollector) throws Failure2, Failure3 { if(count-- == 0) resultCollector.add(47); else { resultCollector.add(11); } if(count < 0) throw new Failure2(); if(count < -1) throw new Failure3(); } } class Processor2b implements Processor { static int count = 2; public void process(List resultCollector) throws Failure2, Failure3 { if(count-- == 0) resultCollector.add(47); else { resultCollector.add(11); } if(count < 0) throw new Failure2(); if(count == 1) throw new Failure3(); } } public class ThrowGenericException36 { public static void main(String[] args) { ProcessRunner 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); } catch(Failure3 e) { System.out.println(e); } ProcessRunner runnerb = new ProcessRunner(); for(int i = 0; i < 3; i++) runnerb.add(new Processor1b()); try { System.out.println(runnerb.processAll()); } catch(Failure1 e) { System.out.println(e); } catch(Failure3 e) { System.out.println(e); } ProcessRunner 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); } catch(Failure3 e) { System.out.println(e); } ProcessRunner runner2b = new ProcessRunner(); for(int i = 0; i < 3; i++) runner2b.add(new Processor2b()); try { System.out.println(runner2b.processAll()); } catch(Failure2 e) { System.out.println(e); } catch(Failure3 e) { System.out.println(e); } } }