Главная » Java » Порядок вычислений Java

0

Независимо от сложности выражения, оно не должно допускать двоякого Толкования. Аргументы операторов просматриваются в порядке слева направо. Например, вычисляя выражение x+y+z, компилятор сначала оценивает операнд х, затем у, выполняет сложение х и у, обращается к z и, наконец, прибавляет значение z к ранее вычисленной сумме операндов х и у. Компилятор не будет Обращаться, скажем, сначала к у, а затем к х, либо к z перед х или у. Подобным образом, слева направо, вычисляются также выражения аргументов при Вызове метода или конструктора и индексные выражения элементов многомерного массива.

Порядок обращения к операндам выражения становится особенно важным, если они сами по себе способны производить те или иные побочные эффекты.

Если аргументы представляют собой, например, вызовы методов, которые специальным образом воздействуют на состояние одного и того же объекта, различия в результатах вычисления выражения при произвольном изменении порядка Просмотра аргументов могут оказаться весьма ощутимыми. Язык обязан гарантировать (и делает это в действительности), что произвола в выборе порядка вычислений быть не может.

Каждый аргумент любого оператора, кроме &&, I I и ?:, вычисляется до момента

выполнения операции. Это справедливо даже в тех случаях, когда операция генерирует исключение. Например, целочисленное деление на нуль приводит к выбрасыванию исключения типа АгithmeticException, но это может случиться только после того, как полностью вычислены оба операнда. Аналогичным образом вычисляются и выражения аргументов метода – до момента его вызова.

Если при обработке выражения левостороннего аргумента бинарного оператора выбрасывается исключение, правый аргумент далее не вычисляется. То же самое происходит в процессе подготовки аргументов метода при его вызове и обращении к элементу многомерного массива – если при вычислении выражения генерируется исключение, последующие выражения аргументов (или индексов) не обрабатываются. Порядок просмотра операндов тщательно регламентирован, и в случае возникновения исключительной ситуации процесс вычислений немедленно прекращается.

Существует, правда, одна особенность, касающаяся поведения системы при создании объектов с помощью оператора new. Если объект не может быть создан из-за нехватки свободной памяти, выбрасывается исключение типа OutOfMemoгуЕrгог. Это происходит до момента вычисления значений аргументов конструктора – системе, занимающейся распределением памяти, эта информация в данный момент просто не нужна. Напротив, в процессе создания массива выражения, задающие его размерности, должны быть вычислены в первую очередь, поскольку системе необходимо знать заранее, какой объем памяти требуется выделить; поэтому в такой ситуации исключение OutOfMemoгуЕrгоr может возникнуть только после обработки выражений-аргументов.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии