Linq FirstorDefault wirft System.NullReferenceException - warum?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Linq FirstorDefault wirft System.NullReferenceException - warum?

    Huhu
    Ich vergleiche zwei DataSets - DtsSettings und DtsExport. Anhand der Artikelnummer möchte ich herausfinden, welche Artikel in DtsExport vorhanden sind und in DtsSettings nicht.
    Das wollte ich mit FirstOrDefault erledigen:

    VB.NET-Quellcode

    1. Private Sub FindNewArticle()
    2. For Each row In DtsExport.Article
    3. Dim articlerow = DtsSettings.Article.FirstOrDefault(Function(x) x.ArtNr = row.ArtNr)
    4. If articlerow Is Nothing Then
    5. MessageBox.Show(row.ArtNr & " nicht gefunden")
    6. End If
    7. Next
    8. End Sub

    Beim Ausführen des Programmes erscheint eine System.NullReferenceException.
    Da ich den Code in einem Unterprojekt in meinem Hauptprojekt untergebracht habe, kann ich leider keinen Haltepunk setzen.
    Wenn ich aber obigen Code auskommentiere, oder dafür sorge, dass ArticleRow nicht nothing ist, läuft mein Programm sauber durch.
    Aber warum kann denn articlerow nicht nothing sein?

    DerSmurf schrieb:

    Da ich den Code in einem Unterprojekt in meinem Hauptprojekt untergebracht habe, kann ich leider keinen Haltepunk setzen.
    Ich sehe zwar keinen Grund, warum das nicht gehen sollte, aber du kannst auch ein Stop-Statement codieren.

    DerSmurf schrieb:

    Dim articlerow = DtsSettings.Article.FirstOrDefault(Function(x) x.ArtNr = row.ArtNr)
    Welchen Datentyp hat DtsSettings?
    Und was ist Article?
    Vielleicht meinst du
    DtsSettings.Article(Function(x) x.ArtNr = row.ArtNr).FirstOrDefault
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    DerSmurf schrieb:

    Beim Ausführen des Programmes erscheint eine System.NullReferenceException.
    In welcher Zeile? Ich tippe auf Z#3. Die setzt voraus, das DtsSettings und DtsSettings.Article nicht Nothing sind.

    DerSmurf schrieb:

    Da ich den Code in einem Unterprojekt in meinem Hauptprojekt untergebracht habe, kann ich leider keinen Haltepunk setzen.
    Das versteh ich nicht. Ach Moment. Du meinst, dass der Fehler auftritt, wenn Dein Hauptprogramm ne andere Exe per Befehlszeile aufruft, richtig? Du kannst aber in Deinem Unterprogramm im Menü Projekt -> Projekteigenschaften -> Debuggen testweise Befehlszeilenparameter eingeben, um das Programm zu testen. Oder notfalls schreibst Du für Testzwecke Deinen Befehlszeilenauswertungscode so um, dass es ohne läuft.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ​Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Der Satz muss aus deiner Signatur raus @VaporiZed , denn du spekulierst doch perfekt, was bei mir nicht passt :o)
    Nein, ernsthaft. Ich werde zukünftig versuchen, euch mit kompletten Infos zu versorgen.
    Dein Tipp der Eingabe von Befehlszeilenparametern beim Debuggen brachte mich auf die Lösung.
    Es ist genauso wie du vermutet hast.
    Ich habe zwar eine Select Case Anweisung geschrieben, wann welche Subs gestartet werden, aber den einen Fall vergessen, indem die xml zum laden von DtsSettings.Article zwar vorhanden, aber leer ist.
    Dann kommt es eben zum oben beschriebenen Fehler.