Поскольку вы самопровозглашенный «новичок», я думаю, было бы неплохо указать на некоторые более широкие проблемы с вашим кодом. (Я знаю, что это не производственный код, но просто предположим, что это было так.)
Если ожидается исключение, обычно проще, понятнее и эффективнее определить условие, которое приведет к возникновению исключения. В этом случае, если вы ожидаете, что divisor
иногда будет равно нулю, лучше проверить его перед делением.
С другой стороны, если исключение совершенно неожиданное (т. е. «ошибка»), лучшая стратегия — позволить исключению распространиться на самый внешний уровень. В этот момент ваше приложение catch должно перехватывать все исключения, регистрировать трассировку стека исключений и выходить из системы.
Помимо предыдущей пули, не стоит ловить Exception
, RuntimeException
, Throwable
или Error
. Это приведет к перехвату большого количества исключений, которые вы, вероятно, не собираетесь перехватывать. В этом случае, поскольку вы ожидаете ArithmeticException
, вы должны поймать именно это.
Редко правильно использовать float
или double
в финансовых приложениях. Эти типы не являются точными, но финансовые приложения обычно требуют точной обработки количества денег.
В более общем смысле числа с плавающей запятой по своей природе трудны для понимания неспециалистами (и новичками). Многие «истины», которых люди ожидают придерживаться, на самом деле не соблюдаются. Например, вычисление 1.0/3.0 + 1.0/3.0 + 1.0/3.0
с плавающей запятой не дает 1.0
. Точно так же (как вы обнаружили) деление на ноль ведет себя по-другому. Если вы хотите безопасно использовать числа с плавающей запятой, вам нужно понимать подводные камни.
ИЗМЕНИТЬ, уточняя первый пункт в ответ на комментарий @Jay.
Во-первых, я намеренно употребил слово «обычно». Бывают случаи, когда предотвращение генерации ожидаемого исключения ничего не дает.
Сказав это, вы часто не хотите, чтобы общее "ожидаемое" исключение возникало, даже если ваше приложение не может немедленно справиться с ситуацией. Например, если код OP был частью чего-то большего, может быть лучше явно выбросить IllegalArgumentException
(если это нарушение контракта API) или несколько проверенных UserEnteredRubbishException
, если мы знаем, что это результат неправильного ввода пользователя (и есть какая-то возможность сообщить/исправить).
Тот факт, что мы "ожидаем" исключения, означает по определению, что мы знаем о нем больше, чем (скажем) сказал бы общий ArithmeticException
. Если мы позволим общему исключению распространяться, блоку catch будет сложнее действовать должным образом. В этом случае, например, удаленный блок catch не мог с уверенностью диагностировать причину деления на ноль. ArithmeticException
могло появиться из другой части приложения и может даже не быть делением на ноль! Способ решения — явное создание более конкретного исключения.
person
Stephen C
schedule
14.02.2010