Почему java.lang.Throwable класс?
В java-прилагательных, заканчивающихся на -able, есть интерфейсы Serializable
, Comparable
и т.д. Итак, почему Throwable
класс? Разве исключение не было бы проще, если Throwable
был интерфейсом? (Редактировать: например, классам исключений не нужно расширять исключение/исключение RuntimeException.)
Очевидно, что изменение этого вопроса сейчас не в этом. Но можно ли это сделать абстрактным? Разве это не позволит избежать плохой практики throw new Throwable()
;
Ответы
Ответ 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
Привет