Rozważ prosty przykład w Javie poniżej. Co się stanie, jeśli utworzę obiekt dzwoniąc pod numer new B(0)
? Najpierw obiekt typu B w pamięci. Następnie wyrażenie 1/n spowoduje zgłoszenie wyjątku. Ale utworzony obiekt nigdy nie zostanie sfinalizowany zgodnie ze specyfikacją Java (§12.6.1) poniżej. Czy otrzymujemy wyciek pamięci?W języku Java, co dzieje się podczas oceniania argumentów wywołania konstruktora, generuje wyjątek?
Proszę zauważyć, że nie pytam "czy konstruktor może rzucić wyjątek", ale "co się stanie, jeśli konstruktor zgłasza wyjątek w określonej sytuacji."
obiekt O nie finalizable aż konstruktor powołuje konstruktora dla obiektu w O, a wywołanie jest zakończone powodzeniem (czyli nie powoduje wyjątku).
class A {
int n;
A(int n) {
this.n = n;
}
}
class B extends A {
B(int n) {
super(1/n);
}
}
Myślę, że "finalizable" oznacza wywołanie 'finalize()', gdy obiekt jest GCed, * nie *, czy obiekt otrzyma GCed. –
Możliwy duplikat [Czy konstruktorzy mogą zgłaszać wyjątki w Javie?] (Http://stackoverflow.com/questions/1371369/can-constructors-throw-exceptions-in-java) – mawalker
@DavidEhrmann Dokładnie. To, czy obiekt jest finalizowany, jest w dużej mierze nieistotne, ponieważ prawie nie ma scenariuszy, w których należy używać finalizatorów. – biziclop