Смотрите что следующий фрагмент кода:
A a = null
try {
a = new A();
} finally {
a.foo(); // What happens at this point?
}
Предположим, что конструктор A выдает исключение на этапе выполнения. В отмеченной строке я, как всегда гарантируют, получу NullPointerException, или нечто () будет вызвано на половину созданного экземпляра?
Код внутри блока try
содержит две различные операции:
A
. a
. Если на шаге 1 выброшено исключение, шаг 2 не будет выполнен.
Следовательно, вы всегда будете получать NullPointerException
.
Если new A ()
вызывает исключение, вы всегда получите исключение NullPointerException, потому что присвоение
не произойдет.
Я думаю, вы всегда получите NPE на отмеченной строке. У задания никогда не будет шанса произойти.
Если исключение произошло в вызове конструктора new A (), на этот раз объект имеет нулевое значение. Таким образом, a.foo () {{1} } выдает исключение для нулевого указателя. вы можете задать условие как if (a! = null) { a.foo (); }