В основном это означает:
Перехватывает «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 a посредника, в то время как первый блок кода не можетиметь связь между потоками, потому что нет посредника.