Подтвердить что ты не робот

Почему java.lang.Throwable класс?

В java-прилагательных, заканчивающихся на -able, есть интерфейсы Serializable, Comparable и т.д. Итак, почему Throwable класс? Разве исключение не было бы проще, если Throwable был интерфейсом? (Редактировать: например, классам исключений не нужно расширять исключение/исключение RuntimeException.)

Очевидно, что изменение этого вопроса сейчас не в этом. Но можно ли это сделать абстрактным? Разве это не позволит избежать плохой практики throw new Throwable();

4b9b3361

Ответ 1

Итак, почему Throwable класс?

Я могу думать о двух причинах:

  • Исключения имеют состояние. В частности, трассировка сообщений, причин и стеков.
  • JVM проще реализовать эффективные блоки catch. Проверка иерархии классов дешевле проверок интерфейса.

Не будет упрощена обработка исключений если Throwable был интерфейсом?

Обработка исключений - сложная тема, независимо от того, являются ли исключения классами или интерфейсами. На самом деле я подозреваю, что это затруднит программистов на Java, если они должны заказать свои блоки catch на основе произвольных интерфейсов, а не на иерархиях классов.

Но может ли он быть абстрактным?

В теории, да. На практике нет. Слишком много кода зависит от возможности создания экземпляра Throwable для вызова getStackTrace.

Ответ 2

Вот как Джеймс Гослинг объяснил свое решение:

Программа подключения Java Developer. Почему Throwable не интерфейс? Название типа предполагает, что это должно было быть. Возможность catch для типов, то есть нечто вроде try {} catch (<some interface or class>), а не только классов. Это сделало бы [] Java [язык программирования] более гибким.

Джеймс Гослинг. Причина, по которой Throwable и остальные из этих парней не являются интерфейсами, потому что мы решили, или я решил довольно рано. Я решил, что хочу иметь какое-то состояние, связанное с каждым исключением, которое бросает. И вы не можете делать это с интерфейсами; вы можете делать это только с помощью классов. Состояние, в котором есть стандарт. Там есть сообщение, есть снимки, такие вещи, которые всегда есть. а также, если вы создаете Throwable интерфейс, соблазн назначить, чтобы любой старый объект был Throwable. Стюартично, что бросать общие объекты - это, вероятно, плохая идея, что вещи, которые вы хотите бросить, действительно должны быть вещами, которые призваны быть исключениями, которые действительно захватывают природу исключения и то, что происходит. Это не просто общие структуры данных.

Ссылки

Ответ 3

хорошо Hashtable также является конкретным классом! Что-то, что может быть хешировано.

и что такое Cloneable? это не правильное английское слово.

Ответ 4

FYI

Вы не можете использовать

void doSomething() throws Serializable

но вы можете использовать дженерики!

<T extends Exception & Serializable> doSomething() throws T

Привет