Ответ 1
В предложении uni-catch вы можете повторно назначить объект исключения. Например, это работает отлично:
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException) {
e = new IOException(); // this is acceptable (although there is no point in doing it)
e.printStackTrace();
}
Компилятор точно знает, что созданный объект имеет тип IOException
. Однако в предложении multi catch вы можете иметь что-то вроде:
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException | ParserException e) {
e = new IOException(); // this is NOT acceptable -- e may reference a ParserException
e.printStackTrace();
}
В этом случае компилятор понятия не имеет, какой тип исключение находится во время компиляции, поэтому присвоение нового IOException
переменной, которая может ссылаться либо на ParseException
IOException
либо на ParseException
не должно быть разрешено. К этому добавляется нехватка прецедентов для назначения переменной исключения в первую очередь. Поэтому имеет смысл сделать переменную неявно final
и избежать всего этого путаницы. Если вам действительно нужно назначить переменную, вы можете перейти на старый способ записи последовательности блоков catch
.