isInstance() в том же классе возвращает false во время обработки исключений

Я новичок в java и пытался реализовать isInstance() в конкретном сценарии обработки исключений.

try {

       ....
       ..//some condition
          throws MyException(); //  --> MyException extends RuntimeException

}catch(Exception e){
       if(e.getClass().isInstance(MyException.class))  // --> This returns false
                .. //do something
}

Вышеприведенный isInstance() возвращает false. При отладке e.getClass() имеет значение:

in.soumav.exceptions.MyException (id=133)

и MyException.class имеет значение:

in.soumav.exceptions.MyException (id=133)

Какую концепцию я упускаю?


person Soumav    schedule 20.01.2019    source источник
comment
Есть ли причина, по которой вы не улавливаете определенные исключения? Повторное использование кода? В этом случае проверьте это: stackoverflow.com/questions/11211286/   -  person Jeppe    schedule 20.01.2019
comment
instanceof, вероятно, лучший выбор.   -  person Boris the Spider    schedule 20.01.2019


Ответы (2)


Вы получили это задом наперёд.

Так должно быть:

if (MyException.class.isInstance(e))

Javadoc:

логическое значение java.lang.Class.isInstance(Object obj)

Определяет, является ли указанный объект совместимым по назначению с объектом, представленным этим классом.

Таким образом, если вы хотите проверить, совместима ли ссылка на экземпляр исключения с помощью e с классом MyException, вы должны передать e в качестве аргумента для MyException.class.isInstance().

В качестве альтернативы вы можете использовать isAssignableFrom:

if (e.getClass().isAssignableFrom(MyException.class))
person Eran    schedule 20.01.2019
comment
e instanceof MyException было бы лучше - person Andrew Tobilko; 20.01.2019

MyException.class является экземпляром класса, а не MyException, поэтому

MyException.class.isInstance(e)

должен сделать это, но ваша цель должна быть обработана следующим образом:

try {

      ....
      ..//some condition
         throws MyException(); //  --> MyException extends RuntimeException

}catch(MyException e){
    ... //do something
}catch(Exception e){
    ...
}
person Turo    schedule 20.01.2019
comment
Упс, я опоздал, но я все еще думаю, что это должно быть обработано блоком catch - person Turo; 20.01.2019