Știu că este o întrebare veche, dar mi-a plăcut și, ca atare, am decis să-i dau un răspuns al meu. Poate că înțelegerea mea de ce nu se poate face acest lucru va contribui la discuția și la viitorii cititori a întrebării dvs. interesante.
Permiteți-mi să încep cu un exemplu de construcție defectuoasă a obiectelor.
Să definim o clasă A, astfel încât:
class A {
private String a = "A";
public A() throws Exception {
throw new Exception();
}
}
Acum, să presupunem că dorim să creăm un obiect de tip A într-un bloc try ... catch
.
A a = null;
try{
a = new A();
}catch(Exception e) {
//...
}
System.out.println(a);
Evident, rezultatul acestui cod va fi: null
.
De ce Java nu returnează o versiune parțial construită a A
? La urma urmei, până la punctul în care constructorul nu reușește, câmpul name
al obiectului a fost deja inițializat, nu?
Ei bine, Java nu poate returna o versiune parțial construită a A
deoarece obiectul nu a fost construit cu succes. Obiectul este într-o stare inconsistentă și, prin urmare, este aruncat de Java. Variabila dvs. A nu este inițializată, este păstrată ca nulă.
Acum, după cum știți, pentru a construi complet un obiect nou, toate clasele super trebuie să fie inițializate mai întâi. Dacă una dintre super-clase nu a reușit să execute, care ar fi starea finală a obiectului? Este imposibil să se determine acest lucru.
Uitați-vă la acest exemplu mai elaborat
class A {
private final int a;
public A() throws Exception {
a = 10;
}
}
class B extends A {
private final int b;
public B() throws Exception {
methodThatThrowsException();
b = 20;
}
}
class C extends B {
public C() throws Exception { super(); }
}
Atunci când se invocă constructorul C
, dacă se face o excepție în timpul inițializării B
, care ar fi valoarea variabilei finale int
b ?
Ca atare, obiectul C nu poate fi creat, este fals, este gunoi, nu este complet inițializat.
Pentru mine, acest lucru explică de ce codul dvs. este ilegal.