Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Klasse (wurde Klasse initialisiert?) (https://www.delphipraxis.net/140211-problem-mit-klasse-wurde-klasse-initialisiert.html)

Dragon27 13. Sep 2009 21:43


Problem mit Klasse (wurde Klasse initialisiert?)
 
Hallo,

ich habe folgenden Quellcode:

Delphi-Quellcode:
    try
      ini:=Tinifile.Create(FPfad+'Gebäude.ini');
      ini.WriteInteger('ID','Gebäude','1');
    finally
      ini.Free;
    end;
Nun sagt Delphi folgende Warnung: [DCC Warnung] Ugebäude.pas(40): W1036 Variable 'ini' ist möglicherweise nicht initialisiert worden

Wie könnte ich in diesem Zusammenhang meinen Quellcode verbessern?

Danke!

Meflin 13. Sep 2009 21:47

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Delphi-Quellcode:
ini:=Tinifile.Create(FPfad+'Gebäude.ini');
try
  ini.WriteInteger('ID','Gebäude','1');
finally
  ini.Free;
end;

mkinzler 14. Sep 2009 06:46

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Dann werden aber Fehler beim Erzeugen der Ini nicht mehr abgefangen

alzaimar 14. Sep 2009 06:53

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Welche Fehler sollten dort denn auftreten?

Ein Konstruktur ist so gestaltet, des er keinerlei Operationen ausführt, die zu einer Exception führen können. Ausgenommen schwere Korken, wie Speicherprobleme OS-Exceptions usw. Die wird man aber in einem geregelten Betrieb eh nicht abfangen können.

himitsu 14. Sep 2009 07:36

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Es ist eher andersrum und jetzt mal auf alle Klassen bezogen....

Richtig: siehe Meflin

Falsch:
Was passiert hier, wenn im Constuctor eine Exception auftreten würde?
Delphi-Quellcode:
try
  ini := Tinifile.Create(FPfad + 'Gebäude.ini');
  ...
finally
  ini.Free;
end;
Genau, der Constructor räumt den Speicher auf und weißt nix der Variable "ini" zu ... also "ini" ist undefiniert und enthält sonstwelche Werte.

Nun leitet diese Exception die Programmausführung in den Finally-Block, wo ini.Free mit irgendwas in "ini" ein nicht existierendes Objekt freigeben will, was zu nocheiner Exception oder Schlimmeren führt.

PS: der Compiler bemeckert hier zurecht ein nicht initialisiertes "ini"

sirius 14. Sep 2009 08:46

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Zitat:

Zitat von alzaimar
Welche Fehler sollten dort denn auftreten?

Im Konstruktor können eine ganze Menge Fehler auftreten. Nur hat der Konstruktor einen eigenen Ressourcenschutzblock. Dadurch kann er dafür sorgen, dass bei einem Fehler gleich der Destruktor automatisch aufgerufen wird. Und wie himi schon schrieb liefert der Konstruktor dann nil zurück, weswegen man auch kein Free aufrufen darf (und auch nicht muss).

DeddyH 14. Sep 2009 08:51

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Wenn der Konstruktor wirklich nil zurückgibt, sollte das Free aber auch nicht zum Fehler führen.

himitsu 14. Sep 2009 08:52

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Nicht ganz ....NIL liefert der dann nicht zurück ... er macht das, was jede andere Funktion auch macht, wenn sie durch eine Exception beendet wurde ... die gibt garkeinen Rückgabewert zurück und die Variable (hier "ini" bleibt unverändert.

Und wie wir alle wissen (sollten), wird eine Objektvariable nicht automatisch initialisiert (so wie z.B. die Strings) und kann sonstwelche zufälligen Werte enthalten.

alzaimar 14. Sep 2009 18:08

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Zitat:

Zitat von sirius
Zitat:

Zitat von alzaimar
Welche Fehler sollten dort denn auftreten?

Im Konstruktor können eine ganze Menge Fehler auftreten.

*Sollten* aber nicht. Konstruktoren sind so zu implementieren, das keine vorhersehbaren Exceptions auftreten. Das Murphy zuschlägt ist klar, man muss ihn aber nicht einladen.

himitsu 14. Sep 2009 18:23

Re: Problem mit Klasse (wurde Klasse initialisiert?)
 
Wenn z.B. jemand versucht aus meiner Klasse ein Objekt zu erstellen und dazu "falsche" Parameter übergibt, dann werfe ich im Constructor eine Exception und fertig.
Ebenso, wenn man z.B. einen FileStream erstellt und kein Zugriff auf die Datei besteht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz