Почему RuntimeException не может быть присвоено Throwable?

Вопрос:

У меня есть метод, который (к сожалению) принимает экземпляр Object как единственный его параметр. Мне нужно добавить логику, которая обрабатывает ее по-разному, если Object является любой тип Throwable (это означает, что все ExceptionsThrowable или не Throwable, а также все Error s).

public void handle(Object toHandle) {
if(toHandle.getClass().isAssignableFrom(Throwable.class))
handleThrowable(toHandle);
}

Когда я вызываю этот метод следующим образом:

RuntimeException rte = new RuntimeExceptio("Panic!");
handle(rte);

Проверка isAssignableFrom возвращает false, а handleThrowable никогда не вызывается. Зачем?

Вместо этого я должен использовать:

public void handle(Object toHandle) {
if(toHanlde instanceof Throwable)
handleThrowable(toHandle);
}

Это работает, как я и ожидал. Но все еще тупик, почему isAssignableFrom не работает… спасибо заранее!

Лучший ответ:

С другой стороны. здесь находится java-документ метода isAssignableFrom(...)

Определяет, является ли класс или интерфейс, представленный этим объектом класса, либо тем же, либо суперклассом или суперинтерфейсом класса или интерфейса, представленного указанным параметром класса. Он возвращает true, если это так; иначе он возвращает false.

Поэтому, когда вы делаете

if (toHandle.getClass().isAssignableFrom(Throwable.class))

Фактически проверяется, является ли RuntimeException класса RuntimeException либо тем же, либо суперклассом или суперинтерфейсом класса или интерфейса, представленных Throwable.

Ответ №1

Посмотрите документацию isAssignableFrom:

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

Таким образом, вы фактически проверяете, является ли класс toHandle суперклассом Throwable. Это не то, что вы хотите.

Вы должны сделать это наоборот:

if (Throwable.class.isAssignableFrom(toHandle.getClass()))

или просто используйте instanceof.

Ответ №2

isAssignableFrom проверяет, соответствует ли this класс классу аргументов или родительскому классу.

В вашем коде вы спрашиваете, является ли toHandle тем же самым, что и родительский Throwable, который, вероятно, не тот, который вы хотите.

Оцените статью
TechArks.Ru
Добавить комментарий