AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen .NET-Sprachen Prism .Net WinForms - NULLPointer Exception beim Methodenaufruf
Thema durchsuchen
Ansicht
Themen-Optionen

.Net WinForms - NULLPointer Exception beim Methodenaufruf

Ein Thema von jensw_2000 · begonnen am 27. Feb 2014 · letzter Beitrag vom 27. Feb 2014
Antwort Antwort
jensw_2000
(Gast)

n/a Beiträge
 
#1

.Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 08:08
Ich habe meinen ersten "unlösbaren Fall" mit WinFowms auf dem Tisch.
Keine Ahnung, wie ich das debuggen soll. Könnt ihr bitte mal drüber schauen?

Ich rufe - jetzt schon in der Minimalversion - in einem Button Klick-Event eine Instanzmethode meinens Formulars auf. Anstatt die Methode aufzurufen kommt eine Nullpointer Exception, die ich im Einzelschritt Debugging nicht mehr greifen kann.
Das hat natürlich schon funktioniert, aber irgendwas ist "kaputt" und ich habe heute Nacht nicht herausgefunden wo es klemmt. Statt in "UpdateServerTime" springt der nächste Schritt in "MainForm.Dispose" > (aDisposing ist TRUE).

Delphi-Quellcode:
type
  MainForm = partial class(System.Windows.Forms.Form)
  private
    fNextUpdateVersion:DateTime := DateTime.Now.AddHours(-1);
    fNextUpdateServerTime:DateTime := DateTime.Now.AddHours(-1);

    property ServerURL:String read get_ServerURL;
    method get_ServerURL: String;

    method button1_Click(sender: System.Object; e: System.EventArgs);
    method UpdateVersion;
    method UpdateServerTime;

  protected
    method Dispose(aDisposing: boolean); override;
  public
    constructor;
  end;



method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);
begin
  self.UpdateServerTime; // BREAKPOINT wird an dieser Stelle angesprungen. "self" ist assigned (klar)
                           // Debug > Next Step > bring NULLPointerException
end;

method MainForm.UpdateVersion;
begin
  if fNextUpdateVersion > DateTime.Now then exit;
  MessageBox.Show('Yippie');
  // Der Rest ist auskommentiert..
end;

method MainForm.UpdateServerTime;
begin
  if fNextUpdateServerTime > DateTime.Now then exit; // BREAKPOINT wird an dieser Stelle NICHT angesprungen
  MessageBox.Show('Yippie');
  // Der Rest ist auskommentiert..
end;

Geändert von jensw_2000 (27. Feb 2014 um 08:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#2

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 11:19
Gibt es eine Variable, die auf das Formular zeigt?

Das "disposing" true ist, dürfte bedeuten, dass der GC zugeschlagen hat.
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#3

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 11:28
In .NET hast Du ja multicast delegates. Es kann also problemlos sein, dass Du zwei oder mehrere Event-Handler an einem Button-Click hängen hast.

Hast Du ggf. versehentlich ein Form-Close auch auf den Button gehängt das zuerst ausgeführt wird?
Hier sollte ein Blick in die Codebehind-Datei helfen, in der die Events verdrahtet werden.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
michaelthuma
(Gast)

n/a Beiträge
 
#4

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 11:59
Clean und Rebuild hilft nicht? Da lebt vermutlich der alte Code noch...

Ich schreibe nur sehr wenig GUI in .net. Rein nach Gefühl ... eher so etwas.

Aus dem Codefragment sehe ich jetzt nicht viel. Hat der Phoenix schon recht mal nachgucken.

Ich habe meinen ersten "unlösbaren Fall" mit WinFowms auf dem Tisch.
Keine Ahnung, wie ich das debuggen soll. Könnt ihr bitte mal drüber schauen?

Ich rufe - jetzt schon in der Minimalversion - in einem Button Klick-Event eine Instanzmethode meinens Formulars auf. Anstatt die Methode aufzurufen kommt eine Nullpointer Exception, die ich im Einzelschritt Debugging nicht mehr greifen kann.
Das hat natürlich schon funktioniert, aber irgendwas ist "kaputt" und ich habe heute Nacht nicht herausgefunden wo es klemmt. Statt in "UpdateServerTime" springt der nächste Schritt in "MainForm.Dispose" > (aDisposing ist TRUE).

Delphi-Quellcode:
type
  MainForm = partial class(System.Windows.Forms.Form)
  private
    fNextUpdateVersion:DateTime := DateTime.Now.AddHours(-1);
    fNextUpdateServerTime:DateTime := DateTime.Now.AddHours(-1);

    property ServerURL:String read get_ServerURL;
    method get_ServerURL: String;

    method button1_Click(sender: System.Object; e: System.EventArgs);
    method UpdateVersion;
    method UpdateServerTime;

  protected
    method Dispose(aDisposing: boolean); override;
  public
    constructor;
  end;



method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);
begin
  self.UpdateServerTime; // BREAKPOINT wird an dieser Stelle angesprungen. "self" ist assigned (klar)
                           // Debug > Next Step > bring NULLPointerException
end;

method MainForm.UpdateVersion;
begin
  if fNextUpdateVersion > DateTime.Now then exit;
  MessageBox.Show('Yippie');
  // Der Rest ist auskommentiert..
end;

method MainForm.UpdateServerTime;
begin
  if fNextUpdateServerTime > DateTime.Now then exit; // BREAKPOINT wird an dieser Stelle NICHT angesprungen
  MessageBox.Show('Yippie');
  // Der Rest ist auskommentiert..
end;
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 14:14
Ich gebe es erstmal auf und speichere mir das Projekt im kaputten Zustand irgendwo ab, damit ich demnächst wieder weitersuchen kann. Interessieren tut es mich schon, was ich da verbockt habe.
Das Formular verhält sich zur Entwurfszeit jedenfalls total wacklig. Dabei ist bis auf einem Button und vier Labeln schon garnichts nichts mehr drauf. . Im Code behind gibt es insgesamt auch nur noch nur einen einzigen EventHandler (der für "Button1_Click").
Mal öffnet der Designer problemlos, man bringt er beim Öffnen den Fehler "Objektinstanz bereits zugewiesen" und mal "Objektinstanz nicht zugewiesen" (alles ohne Zeilenangaben oder Quellcode Verweise). Nach dem Neustart von Visual Studio öffnet er dann aber wieder eine Weile problemlos, ohne das am Formular etwas verändert worden wäre.
Clean & Rebuild hat leider auch nicht geholfen.
Der wichtige Code liegt in einer anderen Assembly. Ich schmeiße das Formular nach dem Sichern weg und mache es schnell neu. Dann kann ich mich wieder mit meinen "echten Problemen" befassen.

Dieser WinForms Designer ist hoffentlich im waren Leben nicht immer so wacklig...
Ich gebe nochmal Bescheid, wenn ich herausgefunden habe was die Ursache war.

Danke erstmal.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 15:42
Mit C# funzt das alles problemlos.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#7

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 18:23
Ja, C# kann Formulare malen und Oxygene auch. Der IL Code war nicht das Problem.
Naja .. eigentlich doch .. ziemlich genau war es das sogar .. ganz alleine
Das ich mein erster WinForms "Test", er auch für andere .Net "Lernsachen" herhalten muss.
Später werden ich den ganzen UI Kram aber auch vorrangig mit C# machen, weil es in der DevExpress Universal Subscription keine Oxygene Projektvorlagen gibt und XAF auch nur C# und VB kann.

Ich habe jetzt aber herausgefunden was ich genau vermasselt habe .
Hätte ich die paar übrigen "Variablendeklarationen" bei dem geposteten Beispielcode vorhin mal nicht weggemacht. Die waren doch wichtig.

So etwa sah das vorhin wirklich aus.
Delphi-Quellcode:
method TMainform.irgendwas;
begin
  MessageBox.show('ich bin nie zu sehen, weil Mainform.irgendwas garnicht aufrufbar ist');

  if fNextUpdateServerSersion > DateTime.Now then exit;

  var lServerVersionInfo:TServerVersionInfo;
  var lSucceeded:Boolean;

  // und zwar deshalb ...
  var lResponse: future TResponse := (async (CommonServiceClient.GetServerVersion(lServerVersionInfo)));

  if assigned(await lResponse) then begin
    //lSucceeded := lResponse.ReturnCode = TReturnCode.rcOK;
    //self.lblServerVersion.Text := if lSucceeded then lServerVersionInfo.VersionString else lResponse:Description;
    //fNextUpdateVersion := if lSucceeded then DateTime.Now.AddSeconds(90) else DateTime.Now.AddSeconds(2);
  end;
end;
Das "FUTURE" "ASYNC" "AWAIT" Konstrukt spaltet ein Task ab, die CommonClient.GetServerVersion parallel ausführt ohne das Mainform zu blockieren, und dann wieder ein im Kontext des UI Thread terminiert. Soweit die Theorie.

In der Praxis ist der "CommonServiceClient" ein Member von Mainform.
Und im Video2Brain Kurs "Multithreading mit .Net" hatte der Typ das sogar gesagt .. .
Man kann in Tasks "problemlos" auf außenliegende Variablen zugreifen kann, muss aber aufpassen, weil der IL_CODE dadurch STARK verändert wird. Die außen liegenden Variablen werden im IL Code zu Public Membern des "Task Threads" und liegen dann gar nicht mehr wirklich "außen". Das sieht man nur nicht im C# oder Pascal Code.

Unter dem Strich habe ich also eine Methode aufgerufen, die einen IL Code ausgeführt hat, welcher meine MainForm Instanz in einen Task Context gezogen hat, dessen Task aber noch garnicht instanziert war.
Resultat - MainForm weg und NullPointer Exception gerechtfertigt und die Nacht umsonst durchgesucht ...

Geändert von jensw_2000 (27. Feb 2014 um 18:34 Uhr)
  Mit Zitat antworten Zitat
michaelthuma
(Gast)

n/a Beiträge
 
#8

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf

  Alt 27. Feb 2014, 20:44
Soweit funktioniert Oxygene schon. Gewöhne dich an die Nächte. Die sind alle gesessen Und du wirst alle seit .net 1.1 nachsitzen. Es gibt viele Gewohnheiten die der .net Mensch mit den Jahren vermeidet. Aber das ist überall so.

Mein Zugang war damals über Sharpdevelop und dem Source der IDE. Das ist lehrreich. Bei Devexpress kommst du C# sowieso nicht aus und auch die ganzen anderen Generator fokusierten Ansätze. Devexpress .net ohne XAF ist nicht der Heuler. Das ist auch eher eine eigene Welt über .net drübergestülpt. Das hat CASE Tool level.

Ja, C# kann Formulare malen und Oxygene auch. Der IL Code war nicht das Problem.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.
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