
Если в блоке try выбрасываются исключения из одной иерархии (суперкласс и дочерний класс), то в multi-catch блоке должен указываться только самый верхний класс данной иерархии.
int a = 10;
try {
switch(a) {
case 10: throw new IOException();
case 100: throw new RemoteException();
case 0: throw new SQLException();
}
// ошибка компиляции. RemoteException является дочерним классом IOException
} catch (RemoteException | IOException | SQLException e) {
System.out.println(e.toString());
}
Если указать только родительский класс, код скомпилируется успешно.
try {
/* ...*/
} catch (IOException | SQLException e) {
System.out.println(e.toString());
}
Если же ислючения имеют одного родителя, но не имеют между собой иерархической связи, каждый из них нужно указывать в блоке multi-catch.
int a = 10;
try {
switch(a) {
case 10: throw new FileNotFoundException();
case -10: throw new RemoteException();
case 0: throw new SQLException();
}
} catch (RemoteException | FileNotFoundException | SQLException e) {
System.out.println(e.toString());
}
}