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?

Jon Skeet
people
quotationmark

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?

It's confusing code - you can simplify the code by just catching IOException, whereas it looks like you really need to catch both of them separately.

I can't say for sure that that's the rationale, but that's the rationale I'd use to justify it. Stop developers from abusing a feature when they can just write simpler code to start with.

people

See more on this question at Stackoverflow