Для C++, я предлагаю Ускоренный C++ Koenig и Мычанием как начинающийся текст, хотя я не знаю, как это было бы для абсолютного новичка. Это фокусируется на использовании STL сразу же, который делает добивающимся цели очень легче.
@ Дэвид Хеффернан имеет правильный ответ. Спецификация JLS говорит о поведении оператора return (включая то, как он взаимодействует с блоками finally) в разделе 14.17. Копирование оттуда (выделено мной):
Оператор return с выражением пытается передать управление вызывающему методу, который его содержит; значение Expression становится значением вызова метода. Точнее, выполнение такого оператора возврата сначала оценивает выражение . Если по какой-либо причине оценка Expression завершается преждевременно, то по этой причине оператор return завершается преждевременно. Если вычисление Expression завершается нормально, производя значение V, тогда оператор return завершается преждевременно, причиной чего является возвращение со значением V. Если выражение имеет тип float и не строго FP (§15.4), тогда значение может быть элементом либо набора значений с плавающей запятой, либо набора значений с расширенной экспонентой с плавающей запятой (§4.2.3). Если выражение имеет тип double и не строго FP, тогда значение может быть элементом либо набора двойных значений, либо набора значений двойной расширенной экспоненты.
Таким образом, видно, что оператор return всегда завершается внезапно.
В предыдущих описаниях говорится «пытается передать управление», а не просто «передает управление», потому что если есть какие-либо операторы try (§14.20) внутри метода или конструктора, чьи блоки try содержат оператор return, то любой оператор finally предложения этих операторов try будут выполняться по порядку, от самого внутреннего к внешнему, до того, как управление будет передано вызывающему методу или конструктору . Внезапное завершение предложения finally может нарушить передачу управления, инициированную оператором return.
Вызов на queryDatabase()
происходит первым. Затем, наконец, блок. Затем управление покидает функцию (это return
).
Предложение finally
должно выполняться независимо от того, каков результат или поведение блока try
, поэтому finally
выполняется до return
.
Если вы используете только один поток, вы должны увидеть «take +, fetch +, fetch-, take-». В вашем примере он многопоточный, поэтому вы не уверены, что произойдет первым.