Переменная получает сбор мусора сразу после блока catch

Я вижу это любопытное поведение сборщика мусора

public class A {
    public static void main(String[] args) {

        String foo;
        try {
            foo = "bar";

            int yoo = 5; //1
        } catch (Exception e) {
        }

        int foobar = 3;//2 
    }
}

. если я перехожу к отладке и ставлю точку останова на //1, foo не равен нулю, и его значение равно «bar», но в точке останова //2 foo имеет значение null, это может быть трудно понять во время отладки. Мой вопрос заключается в том, есть ли какая-либо спецификация, в которой говорится, что это законное поведение сборщика мусора

С этим небольшим изменением он не собирает мусор :

public class A {
    public static void main(String[] args) {

        String foo;
        try {
            foo = "bar";
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        int foobar = 3;
    }
}

. Почему?

7
задан Cœur 4 February 2018 в 13:09
поделиться