![]() |
<Variable> möglicherweise nicht initialisiert
Hiho,
ich bin grad am Bereinigen der Warnmeldungen in meinem Projekt und wollte mich jetzt mal der Meldung "[Warnung] Unit.pas(178): Variable 'aFStream' ist möglicherweise nicht initialisiert worden" annehmen.
Delphi-Quellcode:
Nun könnte ich natürlich die Pfadzuweisung und das Create vor das try verlagern, aber würde das nicht den ganzen Sinn des try..except-Blockes aufheben? Den hab ich ja gerade wegen der Dateioperation geschrieben... :gruebel:
try
FFilePath:= dlgOpenSQL.FileName; aFStream:= TFileStream.Create(FFilePath,fmOpenRead); lblFile.Caption:= dlgOpenSQL.FileName; btnProtocol.Enabled:= True; except on e: Exception do begin MessageDlg('Fehler beim Laden der Datei!'#13#10+e.Message,mtError,[mbOk],0); aFStream.Free; end; end; |
Re: <Variable> möglicherweise nicht initialisiert
Delphi-Quellcode:
Oder soll der Stream nur im Fehlerfall freigegeben werden?
try
FFilePath:= dlgOpenSQL.FileName; aFStream:= TFileStream.Create(FFilePath,fmOpenRead); try lblFile.Caption:= dlgOpenSQL.FileName; btnProtocol.Enabled:= True; finally aFStream.Free; end; except on e: Exception do begin MessageDlg('Fehler beim Laden der Datei!'#13#10+e.Message,mtError,[mbOk],0); end; end; |
Re: <Variable> möglicherweise nicht initialisiert
Die Warnmeldung würdest du auch weg bekommen wenn du vor dem Try-Except-Block die Variable auf nil setzt. Ansonsten ist die Meldung schon berechtigt. Angenommen bei der ersten Anweisung im Block (FFilePath:= dlgOpenSQL.FileName;) tritt eine Exception auf (ich weiß das es unwahrscheinlich ist) so wird versucht im except teil aFStream.Free aufzurufen obwohl aFStream irgendwo ins Nirwana zeigt und somit kracht es gewaltig.
also einfach so:
Delphi-Quellcode:
aFStream := nil;
try FFilePath:= dlgOpenSQL.FileName; aFStream:= TFileStream.Create(FFilePath,fmOpenRead); lblFile.Caption:= dlgOpenSQL.FileName; btnProtocol.Enabled:= True; except on e: Exception do begin MessageDlg('Fehler beim Laden der Datei!'#13#10+e.Message,mtError,[mbOk],0); aFStream.Free; end; end; |
Re: <Variable> möglicherweise nicht initialisiert
Aber was geschieht mit dem Stream, wenn keine Exception auftritt?
|
Re: <Variable> möglicherweise nicht initialisiert
du Antwort kennst du doch selbst :wink: Du hast natürlich recht das dort vergessen wird aufzuräumen. Man könnte das allerdings auch als letzte Anweisung im try machen (vor dem except) wobei das natürlich nicht die schönste Lösung ist.
Grundsätzlich liegt hier im Codedesign ein Denkfehler vor. |
Re: <Variable> möglicherweise nicht initialisiert
@DeddyH:
Hm stimmt. Aber mir fällt grad auf, dass sich an den Block noch was anschließt:
Delphi-Quellcode:
Also das free`en im Exception-Teil, soll im Fehlerfall aufgerufen werden.
if Assigned(aFStream) then
Try ... Finally aFStream.free End; Andererseits: in deinem Code wird aFStream doch auch nicht freigegeben, wenn eine Exception auftritt. EDIT: Ok hab es jetzt so gelöst:
Delphi-Quellcode:
Danke für den Denkanstoß :thumb:
aFStream:= nil;
aSStream:= nil; try try FFilePath:= dlgOpenSQL.FileName; aFStream:= TFileStream.Create(FFilePath,fmOpenRead); aSStream:= TStringStream.Create(aStr); if Assigned(aFStream) then ... finally aFStream.free; aSStream.free; end; except on e: Exception do MessageDlg('Fehler beim Laden der Datei!'#13#10+e.Message,mtError,[mbOk],0); end; edit 2&3: Code berichtigt. |
Re: <Variable> möglicherweise nicht initialisiert
Zitat:
|
Re: <Variable> möglicherweise nicht initialisiert
Zitat:
Danke fürs Erleuchten ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz