2010-03-19 19 views
7

Spójrz że poniższym fragmencie kodu:"zwracana wartość" z wyjątku Konstruktora w Javie?

A a = null 
try { 
    a = new A(); 
} finally { 
    a.foo(); // What happens at this point? 
} 

Załóżmy konstruktora rzuca wyjątek czasu wykonywania. Czy w zaznaczonym wierszu zawsze mam zagwarantowany wyjątek NullPointerException, czy też foo() zostanie wywołany na częściowo skonstruowanej instancji?

Odpowiedz

12

kodu wewnątrz bloku try zawiera dwie oddzielne operacje:

  1. utworzyć nowy A przypadku.
  2. Przypisanie nowej instancji do zmiennej o nazwie a.

Jeśli w kroku 1 zostanie zgłoszony wyjątek, krok 2 nie zostanie wykonany.
Dlatego zawsze otrzymasz numer NullPointerException.

+1

Dlatego napisz jako "final A a = new A(); spróbuj {...} wreszcie {a.foo(); } '. A jeśli potrzebuje wyjątku złapanego, dodaj ** inny ** blok próbny dookoła. –

+0

lub jeśli nie jesteś pewien stanu odwołania 'a' w bloku finally, po prostu owinąć' a.foo() '' (jeśli a! = Null) –

6

Jeśli new A() zgłasza wyjątek, zawsze otrzymasz wyjątek NullPointerException, ponieważ przypisanie do a nie nastąpi.

1

Myślę, że zawsze masz NPE na zaznaczonej linii. Zadanie nigdy nie ma szansy wystąpić.

1

Jeśli wystąpił wyjątek w konstruktorze, wywołaj nowy A(), czas ten obiekt ma wartość null.So a.foo() podaje wyjątek wskaźnika pustego. Możesz podać warunek tak, jakby (a! = null) { a.foo(); }