01 grudnia 2011

Zagadka z Rethrowing Exceptions with More Inclusive Type Checking w Java 7

Czytając bardzo krótki, acz treściwy wpis A New Java Exception Handling Idiom o nowej cesze Java 7 - Rethrowing Exceptions with More Inclusive Type Checking pomyślałem o pewnej zagadce, której próba rozwiązania wymusi choćby minimalne zrozumienie zmian wokół obsługi wyjątków w najnowszym wydaniu Javy 7. Takie perełki sprawiają, że określenie zmian jako niewielkich w tym wydaniu jest czymś, z czym mam kłopot, aby się zgodzić.

Zagadka:
package pl.japila.java7;

public class PreciseRethrowDemo {

    public static void main(String[] args) throws Exception {
        PreciseRethrowDemo demo = new PreciseRethrowDemo();
        demo.createFoo();
    }

    Foo createFoo() throws FooException {
        Bar bar = new Bar();
        try {
            return new Foo(bar);
        } catch (Throwable t) {
            t = new SubFooException();
            bar.cleanup();
            throw t;
        }
    }

    @SuppressWarnings("serial")
    static class FooException extends Exception {}
    @SuppressWarnings("serial")
    static class SubFooException extends FooException {}
    static class Foo {
        Foo(Bar bar) throws FooException {
            throw new FooException();
        };
    }
    static class Bar {
        void cleanup() {};
    }

}
Czy powyższe skompiluje się? Jeśli tak, jaki będzie rezultat? Odpowiedzi można umieszczać w komentarzach. Proszę o kolejne zagadki, jeśli spotkałeś/-aś się z podobnymi w obszarze obsługi wyjątków w Java 7.

p.s. Za kilka dni - 17 grudnia 2011 - kończy się możliwość podejścia do testowego egzaminu na Oracle Certified Associate, Java SE 7 Programmer. System wyliczył mi koszt na poziomie 61 USD i przy niekorzystnym kursie USD/PLN mimo wszystko planuję podejść do niego za 2 tygodnie. A Ty?