Модификация переменных в блоке finally

Модификация переменных в блоке finally

Из блока 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}
Исключения