2015-07-06 13 views
19

Doświadczyliśmy awarii w naszym programie, której nie możemy odtworzyć. Próbuję wprowadzić kod, aby zapobiec powtórzeniu się, ale jestem zdezorientowany przez ślad stosu.Mystery System.Object.GetType() NullReferenceException

System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Object.GetType() 
    at Project.ViewModel.MainVM.<CreateCommands>b__8(Object a) 
    at System.Windows.Controls.Button.OnClick() 

- Mam wyciąć ślad stosu, gdyż właśnie przechodzi w obciążeniu kodu systemu, który jest po prostu to zrobić za pomocą przycisku jest kliknięty. -

Udało mi się wywnioskować, że wskazuje to na mojego anonimowego delegata na linii 8 mojej metody CreateCommands.

 this.sectionCommand = new DelegateCommand(a => 
     { 
      this.OnSectionParameterChanged((Sections)a); 
     }, p => this.IsSectionCommandExecutable); 

Widziałem podobny post tutaj, ale OP był wyraźnie nazywa GetType. Zakładam, że wywołania obsady są typu, ale bez możliwości odtworzenia problemu nie widzę wartości zerowej.

Moje pytanie brzmi: czy śledzenie tego stosu powoduje zerowanie, czy zmienna "a" jest obiektem zerowym? (tak bym napisać coś w stylu):

  if (a != null) 
      { 
       this.OnSectionParameterChanged((Sections)a); 
      } 

lub jest obsadą od "a" do "sekcji" powodującej obiekt zerowy? (Tak powinienem napisać coś podobnego)

  if (a is Sections) 
      { 
       this.OnSectionParameterChanged((Sections)a); 
      } 

Zgodnie z wnioskiem tu OnSectionParameterChanged

private void OnSectionParameterChanged(Sections parameter) 
    { 
     this.SelectedSection = parameter; 

     this.RaisePropertyChanged(() => this.SelectedSection); 

     this.LoadSettingsPanel(); 
    } 

dalej, że wywołuje LoadSettingsPanel

private void LoadSettingsPanel() 
    { 
     if (sectionVMs == null) 
      return; 

     // Get section 
     SectionViewModel = sectionVMs.SingleOrDefault(s.SectionName == SelectedSection); 

     this.IsSelectedSectionEnabled = this.Config.GetIsSectionEnabled(this.SelectedSection); 

     this.RaisePropertyChanged(() => this.IsSelectedSectionEnabled); 

     // Set advanced 
     AdvancedViewModel = this.SectionViewModel; 

     if (AdvancedViewModel != null) 
      HasAdvanced = AdvancedViewModel.HasAdvanced; 
    } 
+3

Bardziej interesujące pytanie brzmi: Dlaczego GetType jest na stosie, mimo że go nie wywołujesz? Opublikuj treść OnSectionParameterChanged. Mogło zostać zainicjowane i nazwane GetType. Ponadto, w jaki sposób GetType może się zawiesić z NRE? Czy to błąd CLR? – usr

+1

czy próbowałeś debugowania? umieść punkt przerwania przed 'this.OnSectionParameterChanged()' i przekonaj się, jaka jest wartość 'a' i użyj natychmiastowego okna, aby zobaczyć wartość' (sekcje) a) 'jest – DLeh

+0

czy był to jednorazowy błąd to nie jest odtwarzalne? być może wyjątek był symptomem innego problemu na komputerze, na którym działa aplikacja. – user1666620

Odpowiedz

28

Problem, który opisałam w rzeczywistości nie było prawdziwy problem. Czytałem na innej stronie, że część śledzenia stosu <CreateCommands>b__8 oznaczała, że ​​problem był w linii 8 metody CreateCommands. To było dokładnie w zestawieniu z anonimowym delegatem i mogłem zobaczyć, jak pasuje ono do zachowania w raporcie o błędzie.

I rzeczywiście znaleźć rozwiązanie mojego problemu za pomocą IL DASM (który można znaleźć w

\ Program Files (x86) \ Microsoft SDK \ Windows \ v7.0A \ Bin

i otworzył EXE, który został uruchomiony i okazało się, że .NET uważał, że to był b__8. Okazało się, że był to inny anonimowy delegat, który jawnie dzwonił pod numer .GetType(), więc problem był naprawdę bardzo łatwy, gdy dowiedziałem się, co właściwie oznacza b__8.

Powiązane problemy