none
ObservableCollection<T> wirft eine NullReferenceException beim Aufruf von Remove bzw. RemoveAt RRS feed

  • Frage

  • Verehrte Community,

    mal wieder plagt mich das .net Framework. Ich habe eine WPF Anwendung. Mit Hilfe von ObservableCollections binde ich die Controls an die Daten. Ich habe nun den Fall, dass ich ein Objekt aus der Collection entfernen und in eine andere einfügen muss. Nun stehe ich vor dem Rätsel, dass ich, egal wie ich das Objekt löschen will, ständig eine NullReferenceException erhalte.

    Ich habe sogar schon den Index des in der Collection gespeicherten Objektes rausgesucht und an RemoveAt übergeben, mit dem gleichen Resultat. Die List selbst ist nicht null. Kann mir bitte jemand erklären, was hier vor sich geht?

    int index;
    for(index = 0;index < this.Model.NonVINTypes.Count;++index) { 
     //Index raussuchen
     if(this.Model.NonVINTypes[index].TypeId == model.TypeId) {
      break;
     }
    }
    
    try {
     this.Model.NonVINTypes.RemoveAt(index); //Index == 7
    
    //...do more...				
    } catch(Exception en) {
     MessageBox.Show(en.Message);
     return;
    }
    

     

    Lt. der MSDN sollte RemoveAt (http://msdn.microsoft.com/de-de/library/ms132414.aspx) höchstens eine ArgumentOutOfRangeException und Remove (http://msdn.microsoft.com/de-de/library/ms132413.aspx) überhaupt keine Exception werfen!?!?!?!?!?

    Ich verwende VS 2010 (C#) Professionel und das .net Framework 4.0.

     

    Viele Dank und viele Grüße

    Holger M. Rößler

    Freitag, 20. August 2010 14:05

Antworten

  • Hallo Holger,

    an der ObservableCollection selbst wird es nicht liegen (dort wären Null-Elemente erlaubt).
    Eher daran, dass dadurch Ereignisse ausgelöst werden wie NotifyCollectionChangedAction.Remove ,
    auf die andere Programmteile reagieren können.
    Schau Dir mal genauer den StackTrace an, wo genau die NullReferenceException auftritt.

    Was den gezeigten Code angeht:
    Der Vorsichtige prüft, ob index < Count ist, denn gibt es keinen Treffer in der for-Schleife,
    so wäre eine ArgumentOutOfRangeException fällig ;-)
    Die alternative LINQ Schreibweise für die For Schleife:

    var item = this.Model.NonVINTypes.Where(t => t.TypeId == model.TypeId).FirstOrDefault();
    if (item != null)
      // ...
    
    
    

    und sollte hier bereits null liefern, wenn kein Treffer.

    Gruß Elmar

    Freitag, 20. August 2010 15:07
    Beantworter
  • Hallo Holger,

    Deine Aussage: "sonst hätte es ..." ist nicht richtig, denn es ist möglich, dass ein Seiteneffekt (etwa die Auswertung von TypeID -> Getter) diese Variablen auf null setzt (natürlich ungewöhnlich, aber möglich).
    Bei einer NullReferenceException ist es in ~99% der Fälle genau der von mir geschilderte Punkt (deswegen lieber erstmal die Frage ;-).
    Danach kommen gleich die möglichen anhängigen Events, die in deren Handler auch Null-Reference Exceptions auslösen können. Ich hatte allerdings auch befürchtet, dass dies kein Realcode ist, sodass andere Codestellen dies verursacht haben könnten.


    ciao Frank
    Freitag, 20. August 2010 19:19

Alle Antworten

  • Hallo Holger,

    ist Model oder NonVINTypes null?

     


    ciao Frank
    Freitag, 20. August 2010 14:59
  • Hallo Holger,

    an der ObservableCollection selbst wird es nicht liegen (dort wären Null-Elemente erlaubt).
    Eher daran, dass dadurch Ereignisse ausgelöst werden wie NotifyCollectionChangedAction.Remove ,
    auf die andere Programmteile reagieren können.
    Schau Dir mal genauer den StackTrace an, wo genau die NullReferenceException auftritt.

    Was den gezeigten Code angeht:
    Der Vorsichtige prüft, ob index < Count ist, denn gibt es keinen Treffer in der for-Schleife,
    so wäre eine ArgumentOutOfRangeException fällig ;-)
    Die alternative LINQ Schreibweise für die For Schleife:

    var item = this.Model.NonVINTypes.Where(t => t.TypeId == model.TypeId).FirstOrDefault();
    if (item != null)
      // ...
    
    
    

    und sollte hier bereits null liefern, wenn kein Treffer.

    Gruß Elmar

    Freitag, 20. August 2010 15:07
    Beantworter
  • Hallo Frank,

    vielen Dank für deine Antwort :o)

    Leider ist keines von beiden null (wäre ja auch ZU einfach gewesen)! Sonst hätte es ja schon in der for Schleifen knallen müssen und nicht erst beim RemoveAt im try catch Block.

    Viele Grüße

    Holger M. Rößler

    Freitag, 20. August 2010 16:14
  • Hallo Elmar,

    vielen Dank für deine Antwort :o)

    Der Code war ja nur ein Beispielcode. Mein Chef würde mich lünchen wenn ich "echten" Code ins Web stellen würde. Und ich wollte hier speziell den Index des Items in der Collection haben, nicht das Item selbst. Aber trotzdem vielen Dank für den Hinweis :o)

    Das mit der NotifyCollectionChangeAction ist ne gute Idee. Hätte ich auch selber darauf kommen können. Am Montag werden wir es sehen, obs damit zu tun hatte.

    Viele Grüße

    Holger M. Rößler

    Freitag, 20. August 2010 16:26
  • Hallo Holger,

    Deine Aussage: "sonst hätte es ..." ist nicht richtig, denn es ist möglich, dass ein Seiteneffekt (etwa die Auswertung von TypeID -> Getter) diese Variablen auf null setzt (natürlich ungewöhnlich, aber möglich).
    Bei einer NullReferenceException ist es in ~99% der Fälle genau der von mir geschilderte Punkt (deswegen lieber erstmal die Frage ;-).
    Danach kommen gleich die möglichen anhängigen Events, die in deren Handler auch Null-Reference Exceptions auslösen können. Ich hatte allerdings auch befürchtet, dass dies kein Realcode ist, sodass andere Codestellen dies verursacht haben könnten.


    ciao Frank
    Freitag, 20. August 2010 19:19
  • Hallo,

    ja, tatsächlich war es der böse EventHandler, der eine Referenz nicht auf null geprüft hat. Booommm!

    Vielen Dank an Euch für eure Hilfe! :o)

    Viele Grüße

    Holger M. Rößler

    Dienstag, 24. August 2010 06:12