почему java.lang.Throwable является классом? - PullRequest
38 голосов
/ 23 мая 2010

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

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

Ответы [ 4 ]

55 голосов
/ 23 мая 2010

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

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

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

Ссылки

17 голосов
/ 23 мая 2010

Так почему же класс Throwable?

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

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

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

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

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

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

2 голосов
/ 23 мая 2010

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

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

0 голосов
/ 10 сентября 2012

FYI

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

void doSomething() throws Serializable

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

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

Привет

...