Você poderia me dizer pode ser algum caso quando a exceção está jogando no construtor e object não é nulo. Quero dizer, alguma parte do object é criada e outra não.
public Test(){ name = "John"; // exception // init some other data. }
Eu entendo neste object sitiation Test será nulo, mas pode ser situação que o teste de object não pode ser nulo (delete bloco de exceção não responder :))?
Uma expressão de criação de instância de class sempre cria um novo object se a avaliação de seu qualificador e argumentos for concluída normalmente e se houver espaço suficiente para criar o object. Não importa se o construtor lança uma exceção; um object ainda é criado. No entanto, a expressão de criação de instância de class não é concluída normalmente, pois propaga a exceção.
No entanto, você ainda pode obter uma referência ao novo object. Considere o seguinte:
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); } }
Aqui, uma referência ao novo object é armazenada em outro lugar antes que a exceção seja lançada. Se você executar este programa, verá que o object não é realmente nulo, embora seu construtor não tenha sido concluído normalmente.
Não. Veja o código do cliente:
Test myObj = null; try { myObj = new Test(); } catch(MyException e) { System.out.println("" + myObj); }
Aqui, quando a exceção ocorre, a operação ‘=’ não é executada. Seu código vai direto para o bloco catch e myObj permanece null
.
Não. Se ocorrer uma exceção durante a instanciação do object, ele não será criado.
De qualquer forma, você escreveria?
MyObject obj = new MyObject(); // This code will not be reachable in case of an Exception
ou:
MyObject obj = null; try { obj = new MyObject(); } catch (AnyException e) { } // Here, either obj is created correctly, or is null as an Exception occurred.
public Test() { name = "John"; try{ // exception // init some other data. }catch(AnyException e) { //catch } }
O código acima faz sentido conforme a sua expectativa.