2013-07-31 21 views
8

Das ist, was ich versuche zu tun:Java - Wenn ich in einem catch-Block zurückkomme, wird der finally-Block ausgeführt?

try { 

    //code 
} catch (Exception e) { 

    return false; 
} finally { 

    //close resources 
} 

Wird diese Arbeit? Ist es eine schlechte Übung? Wäre es das besser tun:

boolean inserted = true; 

try { 

    //code 
} catch (Exception e) { 

    inserted = false; 
} finally { 

    //close resources 
} 

return inserted; 
+6

ausprobiert? – Ankit

+0

dup Alarm! Hast du versucht zu suchen? das wurde mehrmals gefragt ... – devnull

+0

@devnull Ich recherchierte, aber ich war mir nicht sicher, ob es eine gute Sache war. Einige Themen sagten, es sei in Ordnung, während andere Leute sagten, es sei nicht sehr gut. –

Antwort

20

Ja, wird es. Die einzigen Dinge, die verhindern können, dass ein Endblock ausgeführt wird (AFAIR), sind System.exit() und eine Endlosschleife (und natürlich ein JVM-Absturz).

+7

... und ein Stromausfall :) (sprengen, Sie ruiniert es mit dem Hinzufügen der JVM-Absturz) – ppeterka

+0

Aber ist mein erstes Beispiel eine schlechte Praxis? –

+2

Das interessante Bit, das von vielen übersehen wird, ist, dass 'Thread # stop' * nicht * die Ausführung von' finally' verhindert. –

5

Der finally Block immer ausgeführt wird, bedingungslos, als das letzte, was der try-catch-finally Block tut. Selbst wenn Sie Thread#stop dagegen ausführen, wird der finally Block immer noch ausgeführt, als ob eine reguläre Ausnahme aufgetreten wäre.

Nicht nur das, wenn Sie von finally zurückkehren, wird dieser Rückgabewert die Rückmeldung von try oder catch mit Füßen treten.

BTW Ihr erstes Beispiel ist nicht nur gut, aber bevorzugt. Im zweiten Beispiel muss der Leser die Zuweisungen an die Variable verfolgen, was eine langwierige Aufgabe ist und Bugs sehr leicht passieren kann.

+1

Ich bin nicht einverstanden mit '..btw' Teil, ich denke, es ist besser, nur eine Return-Anweisung zu haben, aber das bringt mich dazu, hier zu finden (Woher kam der Begriff von einer Rückkehr nur kommen) [http: // Programmierer. stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from] – nachokk

+1

Das ist eine nette writeup! (die erste Antwort) –

4

Beide sind ungefähr gleich. Seien Sie jedoch vorsichtig mit dem folgenden Fall:

int i = 0; 

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

0 was zurückgegeben werden ist.

+0

Dann denke ich, mein Beispiel ist keine gute Übung, oder? –

+0

@Thecoolguyacrosthestreet Die beste Vorgehensweise besteht darin, möglichst sauberen Code zu verwenden. –

0

Ich wollte nur hinzufügen, dass es in the specs beschrieben ist:

Wenn der catch-Block abrupt Grund R abgeschlossen ist, dann wird der finally-Block ausgeführt.

wo natürlich

Es kann gesehen werden, dann, dass eine Rückkehr Anweisung abrupt immer abgeschlossen ist.