Sun, по-видимому, сделал это, чтобы разрешить выбрасывать проверенные исключения непосредственно из Class.newInstance()
, вместо того, чтобы либо заключать в InvocationTargetException, либо объявить throws Exception
в подписи.
Это "интересный" дизайнрешение, поскольку оно отличается от шаблонов в других местах - например, Constructor.newInstance () обернет любые исключения конструктора в InvocationTargetException.
«Преимущество», которое оно предположительно обеспечивает:
возможность отлавливать исключения конструктора напрямую, в их исходном типе;и
избегает newInstance (), необходимого для объявления throws Exception
и вызывающей стороны для перехвата Exception.
Недостатком является:
проверенные исключения не объявляются.Это устраняет основное преимущество / цель проверенных исключений и может выдавать предупреждения о том, что блок catch недоступен из-за того, что проверенное исключение не было объявлено.
Может ли это быть шаблоном, который вы могли бы использовать в своем коде?Мне это кажется маловероятным.Кажется, что это в основном потенциально применимо к универсальному коду / фреймворку, где код клиента, обернутый фреймворком, потенциально генерирует проверенные исключения.Тогда было бы желательно использовать, только если вы хотите распространять проверенные исключения, не объявляя о том, что они могут быть выброшены. Для меня это сомнительно.
Большинство методов платформы Java, обертывающих код клиента, разработаны в одном изтри парадигмы исключений:
- чисто исключения во время выполнения, или
- , объявляющие
throws Exception
, чтобы разрешить полный спектр проверенных исключений, или - повторного выброса в оболочке'подход (рассмотрите возможность использования неконтролируемого исключения в качестве оболочки).
Этот конкретный метод Class.newInstance
очень необычен, и не объявляя проверенные исключения, которые могут быть потенциально выброшены, он обходит / устраняетединственное реальное преимущество проверенных исключений.
Как правило, произошел серьезный сдвиг в сторону времени выполнения, а не проверенных исключений, и я бы не рекомендовал Unsafe.throwException()
(ни "взлом универсального кода", упомянутый Лукасом выше.)
Для применениякод, я бы порекомендовал использовать исключения во время выполнения, если это возможно, и объявить типы исключений.Для кода платформы рассмотрим три приведенные выше парадигмы с предпочтением к исключениям времени выполнения.
Справочная информация: http://literatejava.com/exceptions/checked-exceptions-javas-biggest-mistake/