2013-07-31 17 views
8

To właśnie staram się robić:Java - Jeśli wrócę w bloku catch, czy zostanie wykonany ostatni blok?

try { 

    //code 
} catch (Exception e) { 

    return false; 
} finally { 

    //close resources 
} 

to będzie działać? Czy to jest zła praktyka? Lepiej byłoby to zrobić:

boolean inserted = true; 

try { 

    //code 
} catch (Exception e) { 

    inserted = false; 
} finally { 

    //close resources 
} 

return inserted; 
+6

próbowałeś się? – Ankit

+0

dup alert! czy próbowałeś szukać? to zostało zadane kilka razy w ciągu ... – devnull

+0

@devnull Badałem, ale nie byłem pewien, czy to dobrze. Niektóre tematy mówiły, że wszystko było w porządku, podczas gdy inni ludzie mówili, że nie było zbyt dobrze. –

Odpowiedz

20

Tak, będzie. Jedyne rzeczy, które mogą uniemożliwić wykonanie bloku końcowego (AFAIR) to System.exit() i nieskończona pętla (i oczywiście awaria JVM).

+7

... i przerwa w zasilaniu :) (wybuch, zrujnowałeś ją dodając awarię JVM) – ppeterka

+0

Ale czy mój pierwszy przykład to zła praktyka? –

+2

Interesujący kawałek, przeoczony przez wielu, polega na tym, że 'Thread # stop' nie * nie * uniemożliwi wykonanie' finally'. –

5

Blok finally jest wykonywany zawsze bezwarunkowo, a ostatnią rzeczą, blok try-catch-finally robi. Nawet jeśli wykonasz przeciwko niemu Thread#stop, blok finally będzie nadal wykonywany, tak jakby wystąpił zwykły wyjątek.

Co więcej, jeśli powrócisz z finally, ta zwracana wartość spowoduje deptanie po zwrocie z try lub catch.

BTW Twój pierwszy przykład nie jest w porządku, ale preferowany. W drugim przykładzie czytelnik musi ścigać się z zadaniami do zmiennej, co jest żmudną pracą i pozwala na łatwe wślizgiwanie się błędów.

+1

Nie zgadzam się z częścią '..btw', myślę, że lepiej jest mieć tylko jedną instrukcję return, ale to prowadzi mnie do znalezienia o tym tutaj (skąd pochodzi tylko jeden zwrot) [http: // programmers. stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from] – nachokk

+1

To ładny zapis! (pierwsza odpowiedź) –

4

Obie są w przybliżeniu takie same. Jednak należy uważać, z następującym przypadku:

int i = 0; 

try 
{ 
    //code 
} 
catch(Exception e) 
{ 
    return i; 
} 
finally 
{ 
    i = 1; 
} 

0 co będą zwracane.

+0

Potem myślę, że mój przykład nie jest dobrą praktyką, prawda? –

+0

@Thecoolguyacrossthestreet Najlepszą praktyką jest stosowanie czystego kodu, gdy tylko jest to możliwe. –

0

Chciałem tylko dodać, że jest to opisane w the specs:

Jeśli blok catch kończy się nagle z przyczyn R, wtedy wreszcie blok jest wykonywany.

gdzie oczywiście

Widać więc, że oświadczenie powrót zawsze kończy się nagle.