обработка нескольких исключений и полиморфизм - PullRequest
0 голосов
/ 15 мая 2018

У меня есть 2 метода

process (MyExceptionType1 e){
...
}

process (MyExceptionType2 e){
...
}

и try / catch:

try{

...

}catch (MyExceptionType1 | MyExceptionType2 e){
process(e);
}

Компилятор отклоняет процесс вызова (e) с этой ошибкой: не найдено подходящего метода для processException(java.lang.Exception)

, как если бы он игнорировал типы, указанные в предложении catch.

, но он принимает

}catch (MyExceptionType1 e){
process(e);
}catch(MyExceptionType2 e){
process(e);
}

Как объяснить это поведение?

Спасибо за вашу помощь.

Надер

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Это недопустимо, потому что во время компиляции тип переменной e в (MyExceptionType1 | MyExceptionType2 e) относится к наиболее конкретному распространенному супер-типу MyExceptionType1 и MyExceptionType2.

Каким бы ни был распространенный супертип MyExceptionType1 и MyExceptionType2, он слишком широк для MyExceptionType1 или MyExceptionType2 в качестве аргумента для метода. Это объясняет, почему он работает с одиночными блоками захвата.

Общий суперкласс этих двух классов, вероятно, будет Exception, если эти два класса не расширяют другой класс исключений. Таким образом, вам может потребоваться проверить экземпляры объектов исключений (то есть, если вы не хотите использовать multi-catch):

process (Exception e){ //If the exceptions extend a common specific type, use it here
    if(e instanceof MyExceptionType1)
       process((MyExceptionType1) e);
    else if (e instanceof MyExceptionType2)
       process((MyExceptionType2) e);
}
0 голосов
/ 15 мая 2018

Вы можете проверить тип исключения, а затем перенаправить на нужный метод.

catch(Exception1 | Exception2 e){
            if(e instanceof Exception1)
                m1((Exception1)e);
            if(e instanceof Exception2)
                m1((Exception2)e);
        }
...