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,
Ein paar Dinge über den obigen Code:
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 ();
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%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%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:
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% Es ist besser, sich nicht mit null
- dem allgemeinen Idiom für Ressourcenerwerb und -freigabe zu beschäftigen Java ist :
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.
Tags und Links java exception-handling try-catch ioexception bufferedreader