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;
}
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
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
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