Wie schließe ich eine Datei nach dem Abfangen einer IOException in Java?

7

Alle,

Ich versuche sicherzustellen, dass eine Datei, die ich mit BufferedReader geöffnet habe, geschlossen wird, wenn ich eine IOException abfange, aber es scheint, als ob mein BufferedReader-Objekt im catch-Block nicht im Gültigkeitsbereich ist.

%Vor%

Netbeans beschwert sich, dass es im catch-Block "symbol fileIn" nicht finden kann, aber ich möchte sicherstellen, dass im Falle einer IOException der Reader geschlossen wird. Wie kann ich das ohne die Hässlichkeit eines zweiten Versuch / Fang-Konstrukts um den ersten tun?

Alle Tipps oder Hinweise zu Best Practice in dieser Situation sind willkommen,

    
DimDom 15.04.2010, 22:05
quelle

7 Antworten

22
%Vor%

Ein paar Dinge über den obigen Code:

  • close sollte in einem finally sein, andernfalls wird es nicht geschlossen, wenn der Code normal beendet wird, oder wenn neben IOException eine andere Ausnahme ausgelöst wird.
  • Normalerweise haben Sie eine statische Hilfsmethode, um eine Ressource wie diese zu schließen, so dass sie auf Null prüft und alle Ausnahmen abfängt (zu denen Sie in diesem Kontext nichts anderes tun wollen als).
  • Die Rückkehr gehört nach dem Versuch, so dass sowohl der Hauptliniencode als auch der Ausnahmefang eine Rückkehrmethode ohne Redundanz haben.
  • Wenn Sie das return in das finally setzen, würde es eine Compiler-Warnung generieren.
Yishai 15.04.2010, 22:09
quelle
1

Sobald Sie den catch-Block angeklickt haben, werden alle Variablen, die im try deklariert sind, nicht mehr im Gültigkeitsbereich. Declare BufferedReader fileIn = null; über dem try-Block, dann ordnen Sie es nach innen zu. Machen Sie in Ihrem catch-Block if (fileIn! = Null) fileIn.close ();

    
purecharger 15.04.2010 22:08
quelle
1

Es beschwert sich darüber, dass das Symbol nicht da ist, weil es nicht ist. Es ist in dem Testblock. Wenn Sie auf fileIn verweisen wollen, müssen Sie es außerhalb des try deklarieren.

Aber es klingt wirklich so, als würden Sie den close in einen finally Block stellen: Sie sollten die Datei unabhängig vom Erfolg oder Fehler schließen, bevor Sie zurückkehren.

%Vor%     
Yuliy 15.04.2010 22:08
quelle
1

Meine bevorzugte Methode zum Aufräumen nach einer Ausnahme (wenn die Bereinigung möglicherweise auch eine Ausnahme auslösen kann) besteht darin, den Code wie folgt in den try-Block in einen anderen try / finally-Block zu schreiben:

%Vor%     
DaveJohnston 15.04.2010 22:16
quelle
0

Verschieben Sie die Deklaration aus dem try-Block:

%Vor%

Aber Sie müssen dennoch darauf achten, dass fileIn tatsächlich initialisiert wurde, bevor Sie versuchen, es zu schließen:

%Vor%     
Kaleb Pederson 15.04.2010 22:07
quelle
0

Deklarieren Sie den BufferedReader außerhalb des try-Blocks und setzen Sie ihn auf null. Verwenden Sie dann einen finally-Block, um ihn zu schließen, wenn er nicht null ist. Auch fileArrayList wird als Referenz übergeben, so dass alle daran vorgenommenen Änderungen mit dem übergebenen Objekt passieren, so dass es auch nicht zurückgegeben werden muss.

%Vor%     
John ClearZ 15.04.2010 22:15
quelle
0

Es ist besser, sich nicht mit null - dem allgemeinen Idiom für Ressourcenerwerb und -freigabe zu beschäftigen Java ist :

%Vor%

so:

%Vor%

Siehe meine Punkte hier

Wenn Sie einen Reader verwenden, müssen Sie die Codierung wie hier angeben. Wenn Sie Bytes lesen wollen, vergessen Sie den Reader. Auch wenn Sie readLine() verwenden, müssen Sie die Zeilenendezeichen vergessen - wenn dies ein Problem ist, sollten Sie das BufferedReader vollständig weglassen.

    
Mr_and_Mrs_D 18.07.2013 21:21
quelle