2011-05-06 13 views
7

Podría decirme que puede haber algún caso cuando la excepción es arrojar el constructor y el objeto no es nulo. Es decir se crea alguna parte del objeto y el otro es not.Like esteJava: Excepción lanzada en el constructor, ¿se puede seguir creando mi objeto?

public Test(){ 
name = "John"; 
// exception 
// init some other data. 
} 

entiendo en este sitiation objeto de prueba será nulo, pero puede ser objeto de prueba situación que no puede ser nulo (borrar un bloque de excepción no contestar :))?

+0

Solo si detecta su excepción allí mismo en el constructor. Quiero decir si no se lanzará más lejos a la persona que llama. – dhblah

Respuesta

19

Una expresión de creación de instancia de clase siempre crea un objeto nuevo si la evaluación de su calificador y argumentos se completa normalmente y si hay espacio suficiente para crear el objeto. No importa si el constructor lanza una excepción; un objeto aún se crea. Sin embargo, la expresión de creación de instancia de clase no se completa normalmente en este caso, ya que propaga la excepción.

Sin embargo, aún puede obtener una referencia al nuevo objeto. Tenga en cuenta lo siguiente:

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); 
    } 
} 

Aquí, una referencia al nuevo objeto se almacena en otro lugar antes de que se produzca la excepción. Si ejecuta este programa, verá que el objeto no es nulo, aunque su constructor no se completó normalmente.

+1

guau, buena respuesta. Nunca pensé en la construcción de objetos como esta. Conozco un problema similar donde la subclase (re) implementa algún método de superclase y, por lo tanto, podría exponer potencialmente objetos parcialmente construidos. Sin embargo, la instancia C en este caso está completamente construida: no es posible (por ejemplo) agregar un campo final a la clase C, inicializarlo como una inicialización de campo y, sin embargo, no tener ese campo inicializado en este caso. – Chii

+0

Tengo escribir la misma prueba :) Gracias. – jitm

+0

Y no solo ver que el objeto no es nulo, podemos usar el método CALL de C.obj; – jitm

2

No. Si se produce una excepción durante la creación de instancias del objeto, no se creará.

De todos modos, ¿lo escribirías?

MyObject obj = new MyObject(); 
// This code will not be reachable in case of an Exception 

o:

MyObject obj = null; 
try { 
    obj = new MyObject(); 
} catch (AnyException e) { 
} 
// Here, either obj is created correctly, or is null as an Exception occurred. 
+0

Sí, lo sé, probé esta situación, pero me interesó saber cuál será o puede ser la situación "mágica" cuando el objeto no es nulo. – jitm

+0

Como dijo Gasan arriba "solo si captas tu excepción allí mismo en el constructor. Es decir, si no se va a tirar más lejos a la persona que llama" Espero que tenga sentido –

4

No. Mira el código de cliente:

Test myObj = null; 
try { 
myObj = new Test(); 
} catch(MyException e) { 
    System.out.println("" + myObj); 
} 

Aquí, cuando se produce una excepción, no se ejecuta la operación '='. Su código va directo al bloque catch y myObj permanece en null.

+0

Sí, lo he probado :), pero decidí pregunte ... – jitm

+0

-1: El objeto no está asignado, pero todavía se crea, vea la otra respuesta. – Daniel

+1

Daniel, ¿quién no está de acuerdo? Lo que escribí dice lo mismo: la asignación no tiene lugar. –

-1
public Test() 
{ 
name = "John"; 

    try{ 
// exception 

// init some other data. 
}catch(AnyException e) 
{ 
//catch 
} 


} 

El código anterior tiene sentido según ur expectativa.

Cuestiones relacionadas