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?
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.