Множественный оператор catch в java - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь понять, как работает несколько операторов catch в java. В документации говорится, что вы не можете иметь связанные типы в операторе catch.

Здесь у меня есть небольшой пример, с которым я играю:

class a extends Exception{}

class b extends RuntimeException{}

public class test{
    public static void main(String[] args){
        try {
            System.out.println(new a() instanceof Exception);
            System.out.println(new b() instanceof Exception);
            throw new a();
        }catch(a | b e) {
            System.out.println(e.getStackTrace());
        }
    }
}

Оба класса являются экземплярами Exception. Во-первых, один очевидный способ, а второй наследуют от RuntimeException и RuntimeExeption наследуют Exception.

Так почему этот код компилируется? Разве исключение a не должно охватывать также исключение b ? Спасибо

1 Ответ

7 голосов
/ 28 января 2020

По related types Я полагаю, что отношения, на которые они ссылаются, это отношения расширений (или подклассов). Итак, в вашем случае вы имеете:

Exception 
├── a
└── RuntimeException
    └── b

a - это подкласс Exception

b - это подкласс RuntimeException, который является подклассом Exception

a не является подкласс b AND b не является подклассом a

, поэтому расширенный блок catch может перехватывать a и b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...