«Возвращаемое значение» из исключения конструктора в Java? - PullRequest
7 голосов
/ 19 марта 2010

Посмотрите, что следующий фрагмент кода:

A a = null
try {
  a = new A();
} finally {
  a.foo();  // What happens at this point?
}

Предположим, конструктор А генерирует исключение во время выполнения. В отмеченной строке я всегда гарантированно получаю исключение NullPointerException, или foo () будет вызываться на наполовину построенном экземпляре?

Ответы [ 4 ]

12 голосов
/ 19 марта 2010

Код внутри блока try содержит две различные операции:

  1. Создать новый A экземпляр.
  2. Назначить новый экземпляр переменной с именем a.

Если на шаге 1 возникнет исключение, шаг 2 не будет выполнен.
Поэтому вы всегда получите NullPointerException.

6 голосов
/ 19 марта 2010

Если new A() вызывает исключение, вы всегда получите исключение NullPointerException, потому что присвоение a не произойдет.

1 голос
/ 19 марта 2010

Если при вызове конструктора new A () возникла исключительная ситуация, тогда объект имеет нулевое значение. Так что a.foo () дает исключение нулевого указателя. Вы можете задать условие, как если бы (a! = Null){a.foo ();}

1 голос
/ 19 марта 2010

Я думаю, вы всегда получите NPE на отмеченной линии. Назначение никогда не может произойти.

...