Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Исключения в арифметических выражениях






При вычислениях значений арифметических выражений возникают особые ситуации, которые без специального вмешательства программиста обрабатываются по разному. Рассмотрим следующий фрагмент кода.

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.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.