Search code examples
javatypesjava-7multi-catch

Why can not Java multi-catch deal with types that is related by subclassing?


Here is a piece of code that shall not compile:

void multiCatch()
{
    try {
        throwIOFile();
    }
    // FileNotFoundException extends IOException, hence this
    // does not compile ("alternatives" related by sub classing):
    catch (IOException | FileNotFoundException e) { }
}

void throwIOFile() throws IOException, FileNotFoundException
{}

Everything works like a charm had not the exception types been related by sub classing. If you swap the IOException in my code snippet for say.. SQLException, it works. The specification reads:

It is a compile-time error if a union of types contains two alternatives Di and Dj (i ≠ j) where Di is a subtype of Dj.

I can not understand the rationale behind this. Granted, the multi-catch in my example is completely redundant since I could just as well catch an IOException only. But what would be the harm in making my code snippet legal? Surely there has to be a harm for a practice to become illegal?


Solution

  • The spec discusses that

    A multi-catch clause can be thought of as a sequence of uni-catch clauses

    so your code is kind of like

        try {
            throwIOFile();
        }
        catch (IOException e) { }
        catch (FileNotFoundException e) { }  // error
    

    This is rejected by javac too. In this case, the error is justified, since the 2nd clause is unreachable.


    However, I don't think the union type should be forbidden. It should be a warning at best.