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?
throws IOException, FileNotFoundException
. In this case, we say that it is a good thing to be explicit of what one could expect. Doesn't the same hold true for multi-catch? – Pinelli