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?
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.
See more on this question at Stackoverflow