Выражение создания экземпляра класса всегда создает новый объект, если оценка его спецификатора и аргументов завершается нормально, и если имеется достаточно места для создания объекта. Неважно, если конструктор выдает исключение; объект все еще создан. Выражение создания экземпляра класса в этом случае обычно не завершается, так как оно распространяет исключение.
Однако вы все равно можете получить ссылку на новый объект. Учтите следующее:
public class C {
static C obj; // stores a "partially constructed" object
C() {
C.obj = this;
throw new RuntimeException();
}
public static void main(String[] args) {
C obj;
try {
obj = new C();
} catch (RuntimeException e) {
/* ignore */
}
System.out.println(C.obj);
}
}
Здесь ссылка на новый объект хранится в другом месте, прежде чем будет сгенерировано исключение. Если вы запустите эту программу, вы увидите, что объект действительно не равен нулю, хотя его конструктор не завершился нормально.