none
Keine Exception, obwohl Objekt = null! Einstellung in Visual Studio?

    Frage

  • Hi,
    ich habe ein kleines Problem mit Visual Studio. Ich einem Projekt gibt mir eine Prozedur 'null' zurück, das ist erstmal nicht schlimm. Bei der weiteren Verwendung der Variablen meckert Visual Studio im Debug-Modus nicht, wenn ich die kompilierte EXE dann starte, stürzt das Programm ab. Folgendes Szenario:


    In einer Prozedur gibt eine Funktion 'null' zurück, von mir aus:

    tempModelInstanz = ASettings.GebeEinePropertyZurueck; //Diese Prozedur gibt 'null' zurück!!!
    Irgendwo weiter im Programm, in einer anderen Prozedur wird dieser Rückgabewert weiterverarbeitet:

    var res = CollectionOfModel.Where(s => s.EinStringProperty == tempModelInstanz.EinStringProperty).FirstOrDefault();
    if (res != null)
    {
    	PropertyModelInstanz.PropertyString = tempModelInstanz.EinStringProperty;
    };
    Im Debug-Modus passiert nichts, keine Exception, nix! Obwohl 'tempModelInstanz' = null ist!

    Ok, eigentlich bin ich selber schuld, letztendlich habe ich vorher zu prüfen, ob das Objekt 'null' ist, das ist klar.
    Aber gibt es irgendwo im VS eine Einstellung, die mir schon im Debug-Modus au die Finger haut?

    Danke, Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 14. September 2018 13:37

Antworten

Alle Antworten

  • Hi Stefan,

    kann es sein, dass CollectionOfModel im Debug-Modus leer ist?

    ...hat nichts mit deiner Frage zu tun: Man könnte statt Where gleich FirstOrDefault(s => s.EinStringProperty == tempModelInstanz.EinStringProperty) verwenden.

    Gruß
    Heiko

    Freitag, 14. September 2018 17:26
  • Hallo Heiko,

    die CollectionOfModel ist nicht leer. Lediglich tempModelInstanz ist 'null'.

    Die Zustände der Eigenschaften sind ok, wie sie zu diesem Zeitpunkt sind. Ich hätte nur gerne eine Exception, wenn ich so etwas nicht abgefangen habe.


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 14. September 2018 18:11
  • Hi Stefan,
    der Compiler ist nicht in der Lage zu erkennen, was zur Ausführungszeit alles passieren kann. Woher soll er wissen, dass ein Objektverweis auch null sein kann?

    Wenn in Deinem Programm auch die Möglichkeit der Rückgabe eines Nullwertes möglich sein kann, dann musst Du das abfangen, was aber erst zur Ausführungszeit gemacht wird. Dafür kannst Du auch das seit C# 7 mögliche Fragezeichen nutzen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Freitag, 14. September 2018 19:38
  • Hallo Peter,

    das mit dem Abfangen ist klar. Das ist mein Fehler, hab ich an der Stelle einfach vergessen.

    Was mich nur wundert ist, wenn ich das Programm im VS über F5 starte, und tempModelInstanz = null ist (das ist beim allerersten Start der Anwendung), läuft das Programm ohne Exception weiter. VS verzeiht mir den Fehler.

    Starte ich die EXE, schmiert das Programm an der Stelle ab. 

    Ich bin immer davon ausgegangen, das jedes mal eine Exception geworfen wird, wenn man versucht auch ein Objekt zuzugreifen, wenn es null ist. 

    Das scheint in dieser Konstellation:

    var res = CollectionOfModel.Where(s => s.EinStringProperty == tempModelInstanz.EinStringProperty).FirstOrDefault();

    ...aber anders zu sein.


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 14. September 2018 20:09
  • Hi Stefan,
    wie sehen denn die Einstellungen aus?

    Tools -> Options

    Und die Debug-Einstellungen (bei bestimmter Ausnahme nicht anhalten)


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Stefan Krömer Samstag, 15. September 2018 11:04
    Samstag, 15. September 2018 03:33
  • Hallo Peter,

    bei mir sieht das aktuell so aus:

    Wenn ich eine "klassische" NullReferenceException provoziere, bekomme ich sie auch. Ich denke es liegt an dieser Zeile: var res = CollectionOfModel.Where(s => s.EinStringProperty == tempModelInstanz.EinStringProperty).FirstOrDefault();

    Letztendlich habe ich diese Frage gestellt, weil mir nicht klar war, das es eine Situation gibt, wo VS einen derartigen Fehler (meinerseits) verzeiht. Direkt vor dieser Abfrage schreibe ich Daten in eine JSON-Datei. Und da diese Abfrage beim allerersten Programmstart nicht relevant ist, habe ich natürlich erst an der falschen Stelle gesucht, in der Serialisierung, dem TextWriter....

    Danke für deine Mühe.


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Samstag, 15. September 2018 07:45
  • Hi Stefan,
    und was passiert, wenn Du die Einstellungen wie von mir gepostet vornimmst (-> nur meinen Code aktivieren)?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Samstag, 15. September 2018 09:42
  • Hi Stefan,

    ein Strohhalm: Hast du den Lambda-Ausdruck schon mal gedebugged?

    tempModelInstanz = ASettings.GebeEinePropertyZurueck; //Diese Prozedur gibt 'null' zurück!!!
    var res = CollectionOfModel.Where(s =>
      {
         // Breakpoint, F9
         return s.EinStringProperty == tempModelInstanz.EinStringProperty;
      }).FirstOrDefault();

    Du verwendest auch kein DebuggerDisplay() für den Typ von 'tempModelInstanz', der in der Debugger-Anzeige einen Wert einer Instanzvariablen anzeigt, die gerade auf null steht ?

    Gruß
    Heiko

    Samstag, 15. September 2018 10:18
  • Hallo Peter,

    habe die Einstellungen geändert. Jetzt hält mein Programm, wie gewünscht, an.

    Vielen Dank!

    Ich bin mir nicht mehr sicher, aber ich glaube,ich habe die Einstellung mal geändert, als ich in einem anderen Projekt mit fmpeg herumgespielt habe. 

    Interessant ist, das ich jetzt noch einen Fehler gefunden habe, der weder im Debug-Modus, noch beim ausführen der EXE aufgefallen ist.

    Auf jeden Fall ist jetzt alles im grünen Bereich. 

    Nochmals Danke, Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Samstag, 15. September 2018 11:03
  • Hallo Heiko,

    ich hatte mir an der Stelle einen Breakpoint gesetzt und gesehen, das tempModelInstanz gleich 'null' ist. Wie gesagt, das die Eigenschaft an der Stelle in der Situation null ist, ist nicht schlimm. Mich hat halt nur gestört, das der Debugger an der Stelle nicht angehalten hat, aber die EXE abgeschmiert ist. 

    Das DebuggerDisplay Attribute habe ich bisher noch nicht genutzt, werde ich mal machen.

    Danke, Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Samstag, 15. September 2018 11:08