Will a subclass catch block catch a checked parent exception?

Sajhu picture Sajhu · Jul 18, 2016 · Viewed 7.9k times · Source

I have a method with a checked exception for a parent class, which can throw exceptions of the type parent and subclass

public void method() throws ParentException {
    if( false ) throw new ParentException();
    else if( true ) throw new ChildException(); // this one is thrown
}

and I have a cascade catch block, which first has the child exception

try {
    method();
} catch (ChildException e) {
    // I get here?
} catch (ParentException e) {
    // or here?

}

Which block will catch the exception thrown? Since the method declares explicitly the ParentException only, would the ChildException be shown as an instance of ParentException?

Answer

Makoto picture Makoto · Jul 18, 2016

The catch block will always catch the most specific exception available to it, working its way up from the inheritance hierarchy.

I should stress that your catch blocks must be in the inheritance hierarchy order; that is to say, you may not declare a catch block with ParentException followed by ChildException, as that is a compilation error. What you have there (in terms of catch blocks) is valid.

A more common use case of this is when handling file IO; you can first catch FileNotFoundException, then IOException, should the error be less specific than FileNotFoundException.