Java: Meaning of catch (final SomeException e)?

What does final do in the following Java expression?

catch (final SomeExceptionType e)
32
задан Matteo 28 October 2013 в 08:03
поделиться

3 ответа

По сути, это означает:

Перехватить SomeExceptionType в переменную «e» с обещанием, что мы не будем назначать другое исключение «e» во время обработки исключения.

В основном это перебор, как будто я перехватываю исключение во временном имени переменной (e допустимо только для блока обработки исключений), мне не нужно так строго контролировать себя, чтобы не доверять себе присваивать другое (возможно, созданное) исключение для того же имени переменной.

Тем не менее, возможно, этот блок в значительной степени поддерживается командой людей с разными взглядами, и кто-то просто хотел быть ОЧЕНЬ уверенным, что e было исходным захваченным исключением.

---- Отредактировано в ответ на комментарий ----

Я не могу придумать действительно отличной причины для этого. Поскольку «e» не является членом (статическим или каким-либо другим), имя «e» не будет использоваться после компиляции файла класса. Другой способ заявить об этом заключается в том, что когда вы вводите блок обработки исключений байт-кода JVM, объект не будет назначен ни одному из имен членов, доступных для кадра обработки JVM, он будет помещен во внутренний стек обработки потока текущий кадр.

Даже если бы два потока имели доступ к одному и тому же объекту, каждый поток имел бы свой собственный фрейм, поэтому компилятор удалил имя «e» из внутреннего стека одного фрейма, не могло быть изменено другим потоком.

Имея это в виду, единственное преимущество объявления «e» окончательным - это гарантия того, что будущие кодировщики случайно не установят «e» после входа в блок.Возможно, они хотели сделать код более надежным в многопоточной среде, но временные переменные (те, имена которых действительны только в блоке) не имеют имен после компиляции, они помещаются в стек фрейма.

Вот почему

public int safe() {
  int x = 5;
  x = x + 5;
  return x;
}

обычно считается потокобезопасным, потому что он делает это (в псевдобайт-коде)

(In the thread's current frame)
push 5
push 5
add integers
return

Хотя это не потокобезопасный

int x = 5;

public void unsafe() {
  x = 5;
  x = x + 5;
  return x;
}

, потому что он делает это

(in the thread's current frame)
push "this"
push 5
set member x
push "this"
get member x
push 5
add integer
set member x
get member x
return

Последний байт-код делает очевидным это чередование двух потоков создает межпотоковую связь с использованием члена x в качестве посредника, в то время как первый блок кода не может иметь никакого межпоточного взаимодействия, потому что нет посредника.

32
ответ дан 27 November 2019 в 20:51
поделиться

В настоящее время это означает final во многом то же, что и любая локальная переменная, за исключением того, что она всегда «определенно назначена».

В последних сборках JDK7 изменение языка Project Coin позволяет указать степень неявной статической типизации. Одиночный перехватчик может перехватывать несколько различных проверенных исключений по общему базовому типу и повторно генерировать с охватывающим контекстом только с перехватом или объявлением тех исключений, которые (статически говоря) могут быть сгенерированы в рамках попытки . . (См. Ссылку для лучшего объяснения.)

11
ответ дан 27 November 2019 в 20:51
поделиться

Ключевое слово final для переменных означает, что переменная может быть назначена только один раз, а поскольку присвоение здесь выполняется компилятором, это означает, что переменная не может быть изменена позже в коде.

Это важное свойство, поскольку оно означает для сопровождающего, что эта конкретная переменная будет иметь это конкретное значение везде, где она используется, и нет необходимости отслеживать, где она изменяется. Это признано настолько полезным, что действие «Очистить» в Eclipse позволяет добавлять «финал» везде, где это возможно, и я считаю, что то, что вы видите, является результатом такой автоматической очистки, потому что большинство людей-программистов сделают блок перехвата коротким, поэтому в таком указании нет необходимости.

2
ответ дан 27 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: