Поскольку вы самопровозглашенный «новичок», я думаю, что было бы неплохо указать на некоторые более широкие проблемы с вашим кодом. (Я знаю, что это не рабочий код, но давайте просто предположим, что это так.)
Если ожидается исключение, обычно проще, понятнее и эффективнее, если вы обнаружите условие, которое приведет к исключению. В этом случае, если вы ожидаете, что divisor
иногда будет равен нулю, лучше проверить его перед выполнением деления.
С другой стороны, если исключение является совершенно неожиданным (т. Е. «Ошибкой»), лучшая стратегия состоит в том, чтобы исключение распространялось на самый внешний уровень. В этот момент ваш перехват приложения должен перехватить все исключения, записать трассировку стека исключений и выручить.
Помимо предыдущей маркировки, ловить 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
сказал бы. Если мы разрешим распространению универсального исключения, это усложнит для блока перехвата много кадров стека, чтобы действовать должным образом. В этом случае, например, удаленный блок перехвата не может с уверенностью диагностировать причину деления на ноль. ArithmeticException
может происходить из другой части приложения, а не может даже делиться на ноль! Способ решения проблемы заключается в явном генерировании более конкретного исключения.