Die Ausnahme wird schließlich verschluckt

8
%Vor%

Ein Freund von mir ist ein .NET-Entwickler und migriert gerade nach Java und er stellt mir die folgende Frage zu dieser Quelle. Theoretisch muss dies throw IOException("Exception rised.") und die gesamte Methode retIntExc() muss throws Exception sein. Aber nichts passiert, die Methode gibt 2 zurück.

Ich habe sein Beispiel nicht getestet, aber ich denke, dass dies nicht das erwartete Verhalten ist.

EDIT: Danke für alle Antworten. Einige von euch haben die Tatsache ignoriert, dass die Methode retIntExc heißt, was bedeutet, dass dies nur ein Test- / Experimentalbeispiel ist, das ein Problem in der Wurf / Fang-Mechanik zeigt. Ich brauchte kein 'Fix', ich brauchte eine Erklärung, warum das passiert.

    
fiction 17.01.2011, 07:56
quelle

7 Antworten

16

Deshalb können Sie nicht von einem finally-Block in C # zurückkehren:)

Es ist jedoch absolut das in der Java Language Specification beschriebene Verhalten. Es ist in Abschnitt 14.20.2 angegeben.

  

Wenn der finally-Block abrupt aus Gründen S abgeschlossen wird, wird die try-Anweisung abrupt aus Gründen S beendet (und das Werfen von Wert V wird verworfen und vergessen).

Die Rückkehr ist ein Beispiel für die abrupte Vollendung; Wenn der Block finally eine Ausnahme auslöst, wird auch abrupt beendet, wobei die ursprüngliche Ausnahme verloren geht.

Das obige Zitat stammt aus dieser verschachtelten Menge von Aufzählungszeichen und lässt die Optionen aus, die hier nicht anwendbar sind:

  
  • Wenn die Ausführung des try-Blocks wegen eines Wurfs mit einem Wert V abrupt beendet wird, gibt es eine Auswahl:      
    • Wenn der Laufzeittyp von V nicht dem Parameter einer catch-Klausel der try-Anweisung zuweisbar ist, wird der finally-Block ausgeführt. Dann gibt es eine Wahl:      
      • Wenn der finally-Block abrupt aus Gründen S abgeschlossen wird, wird die try-Anweisung abrupt aus Gründen S beendet (und der Wert von V wird verworfen und vergessen).
      •   
    •   
  •   
    
Jon Skeet 17.01.2011, 08:02
quelle
3

Es gibt 2 zurück, weil

finally führt immer

aus     
user467871 17.01.2011 07:58
quelle
2

Der finally -Block wird ausgeführt, egal welche Ausnahme ausgelöst wird. Es wird nicht nur ausgeführt, nachdem die Ausnahmen von den deklarierten catch -Blöcken abgefangen wurden. Es wird nach dem try -Block und den Ausnahmen, falls vorhanden, ausgelöst . Wenn Ihre Methode eine Ausnahme auslöst, kann sie nur dann zurückgegeben werden, wenn Sie sie in Ihrer Methode verschlucken und result zurückgeben. Aber du kannst nicht beides haben.

Wenn Ihre Methode keinen anderen Code hat, wird auch ArrayIndexOutOfBoundsException nicht gefunden.

    
BoltClock 17.01.2011 08:01
quelle
2

Dies liegt daran, dass Sie eine return-Anweisung ausgeben, bevor die Ausnahme übergeben wird und somit ein gültiger Wert zurückgegeben wird. Sie können keinen Wert zurückgeben und eine Ausnahme auslösen.

Wenn Sie den finally block um die return entfernen, erhalten Sie das gewünschte Verhalten.

    
dtech 17.01.2011 08:03
quelle
0

Die IOException -Klasse ist kein untergeordnetes Element der ArrayIndexOutOfBoundsException -Klasse, daher wird der Catch-Teil nie ausgeführt.

Wenn Sie es ändern, gibt es 3 zurück.

%Vor%     
Bence Olah 17.01.2011 08:02
quelle
0

Ich verstehe nicht, warum das nicht erwartet werden würde. Am Ende dieses Codeblocks ist das Ergebnis gleich 2.

%Vor%

Sie werfen dann eine Ausnahme, aber Ihr catch-Block fängt Ausnahmen eines anderen Typs ab, so dass nichts ausgeführt wird.

%Vor%

Der finally-Block wird garantiert ausgeführt, also ist der letzte Schritt, 2 zurückzugeben.

Diese erfolgreiche Rückgabe hebt die sprudelnde Ausnahme auf. Wenn Sie möchten, dass die Ausnahme weiterhin sprudelt, dürfen Sie nicht im finally-Block zurückkehren.

    
James Greenhalgh 17.01.2011 08:04
quelle
0

Indem Sie return in der finally-Methode setzen, überschreiben Sie die ausgelöste Ausnahme, und stattdessen wird result zurückgegeben. Ihr Code sollte etwa so aussehen:

%Vor%     
padis 17.01.2011 08:06
quelle

Tags und Links