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

Исключенное исключение, которое было бы лучше, чем указано

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

Скорее, я хотел бы задать очень конкретный вопрос, который пришел на ум, когда я читал Joshua Bloch Effective Java, 2nd Edition. Когда я читал, я заметил, что в пункте 59 ( "Избегайте ненужного использования проверенных исключений" ) Джошуа приводит пример в Java API, где используется проверенное исключение. В частности, в Object:

protected Object clone()
            throws CloneNotSupportedException

... и затем утверждает, что это должно быть исключение, исключенное.

Если программист, использующий API, может сделать не лучше, исключаемое исключение было бы более уместным. Одним из примеров исключения, который не прошел этот тест, является CloneNotSupportedException. Он вызывается Object.clone, который должен вызываться только для объектов, реализующих Cloneable (Item 11). На практике блок catch почти всегда имеет характер ошибки утверждения. Проверенный характер исключения не приносит пользы программисту, но требует усилий и усложняет программы.

Затем я посмотрел, есть ли у него пример обращения, но я не мог найти его.

Итак, я хотел бы спросить, может ли кто-нибудь дать пример API в Java, который использует неконтролируемое исключение, но где исключенное исключение было бы лучшим выбором и объяснить, почему. Пример в реальном мире был бы предпочтительнее, но я открыт для надуманного примера, если бы это тоже хорошо иллюстрировало бы.

Изменить: Тем, кто голосовал за то, чтобы закрыть это как неконструктивное, я хочу дать понять, что я не ищу мнения, дискуссии, аргументы или расширенное обсуждение. Я также не беру опрос. Скорее, я ищу ссылки на примеры, которые дают четкий анализ того, как выгоды перевешивают затраты. (Неясно, что это признает, что есть издержки.) Тем не менее, я скептически отношусь к тому, делает ли этот вопрос этот характер. Я считаю, что если Джон Скит не сможет этого сделать, маловероятно, что это можно сделать. Так что, возможно, ты прав. Закройте, если нужно.

Изменить: Хотя я не обеспокоен ответом, я собираюсь присудить это Джону только за мою скорость приема.

4b9b3361

Ответ 1

Yup, легко: Integer.parseInt throws NumberFormatException, который не установлен.

Однако, если вы когда-либо разбираете потенциально-плохие данные, вам обязательно нужно подумать о том, чтобы поймать исключение - вы можете очень хорошо игнорировать эти данные или, возможно, сообщить об этом и продолжить. Это не похоже на то, что Java имеет эквивалент .NET Int32.TryParse, который позволяет легко игнорировать плохие данные. В основном вам нужно знать, что вам нужно поймать исключение, без провокации компилятора. Grr.