Вот некоторые примеры кода, чтобы проиллюстрировать наш вопрос:Присвоение значения при возникновении исключения (Java)
A a = null;
try {
a = new A();
a = doSomethingThatWillThrowAnException();
} finally {
System.out.println("A = " + a);
}
Вопрос заключается в том, что значение «а», как напечатано в конце концов блок ...
Я не уверен, и я думаю, что наткнулся на то, что не может быть полностью описано. Я наблюдал на своем ноутбуке (jdk1.6.0.16 на x86), что «a» равно A(). Однако с JDK 1.4 на Solaris я считаю, что значение равно null (например, если присваивание выполнялось даже при исключении исключения). Это, очевидно, связано с ошибкой, и мы будем развертывать версию без назначения только для того, чтобы убедиться, но мы хотели бы знать, заметил ли кто-то из вас это или предложил какое-то объяснение.
Мы также сделаем пример программы, чтобы продемонстрировать это на проблемном JDK ... и мы опубликуем результаты.
@Aaron:. Новый A() в исходном коде не могут быть оптимизированы в сторону, так как в результате объект используется в некоторых исполнениях –
Почему комментарий Аарона вниз проголосовали ничего не делается? с исходной ссылкой «A», и, конечно же, возможно, что JIT (на Solaris JDK 1.4) просто NOPs это прочь. В этом случае блок finally увидит нуль. – alphazero