![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Исключения в арифметических выражениях
При вычислениях значений арифметических выражений возникают особые ситуации, которые без специального вмешательства программиста обрабатываются по разному. Рассмотрим следующий фрагмент кода. int x = 111111, y = 111111, z = 0; double a = x / 0.0; //результат: " бесконечность" //double b = x / 0; //ошибка компиляции double c = x / z; //исключение DivideByZeroException double d = x * y; //результат: -539247567 Как отмечено в комментариях, все приведённые выражения приводят к возникновению особых ситуаций. В первых трёх случаях программист по сообщениям компилятора или по результатам выполнения программы может явно распознать ситуацию. Значением переменной а=х/0.0 является бесконечно большая величина. В случае b=х/0 компилятор выдаёт сообщение о попытке целочисленного деления на нулевую константу. Выражение c=x/z не смущает компилятор, но приводит к генерации исключения System.DivideByZeroException на этапе выполнения программы. В случае вычисления х*у происходит целочисленное переполнение, но никаких признаков особой ситуации нет. Правда, переменной d присваивается некоторое отрицательное значение после умножения двух положительных величин. В нашем простом примере этот результат может служить сигналом об особой ситуации. Однако в сложных арифметических выражениях целочисленное переполнение может остаться незамеченным, но приведёт к неверному результату. Для отслеживания таких ошибок в арифметических выражениях следует использовать служебное слово checked. Это слово играет две роли, оно обозначает операцию и вводит специальный блок " наблюдения" за переполнениями при вычислениях выражений: checked (выражение) checked {операторы} В первом случае отслеживаются возникновения переполнений в заключённом в скобки выражении. Во втором случае контролируются переполнения во всех операторах блока. В обоих случаях при возникновении переполнения генерируется исключение System.OverflowException. Наш пример можно дополнить оператором double e= checked(x*y); В этом случае переполнение при вычислении выражения х*у не будет игнорироваться, а приведёт к генерации названного исключения. Обработка такого исключения может быть организована обычным образом с помощью блока try/catch. Рассмотренный пример может привести к другим результатам, если будут изменены опции компилятора или настройки исполняющей системы. Чтобы при выполнении программы никогда не посылались исключения переполнения в арифметических операциях, можно использовать служебное слово unchecked.
|