
Из блока catch в finally переменные передаются по значению. Поэтому, если в блоке finally производятся какие-то модификации переменной примитивного типа, вызывающий метод получит то значение переменной, она имела в блоке catch.
class A {
static int var = 5;
static int getVar() {
try {
byte[] b = {1, 2};
System.out.println(b[5]);
} catch (Exception e) {
return var;
} finally {
var *= 100;
System.out.println("New value is " + var);
}
return var;
}
}
System.out.println("A.var = " + a.getVar());
/*
New value is 500
A.var = 5
*/
Однако, если переменная была ссылочного типа, то блок finally, производя модификацию объекта через копию ссылки, изменяет исходный объект.
static Map< Integer, String > m = new HashMap<>();
static Map< Integer, String > getMap() {
m.put(1, "One");
m.put(2, "Two");
try {
byte[] b = {1, 2};
System.out.println(b[5]);
} catch (Exception e) {
return m;
} finally {
m.put(3, "Three");
}
return m;
}
System.out.println(A.getMap()); // {1 = One, 2 = Two, 3 = Three}