2015-07-06 13 views
19

Programımızda artık yeniden üretemediğimiz bir kilitlenme yaşadık. Tekrar olmasını engellemek için bir kod koymayı deniyorum ama yığın izinin üzerinde kafam karıştı. 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() 

- sadece düğmeye tıklandığında edilmekle ilgili adildir sistem kodunun bir yük gider gibi yığın izlemesi aşağı kestik. -

CreateCommands yöntemimin 8. satırı üzerindeki anonim temsilci işaret ettiğini anladım.

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

Burada benzer bir gönderi gördüm, ancak OP, GetType'ı açıkça çağırıyordu. Yayın çağrılarının tür aldığını, ancak sorunu yeniden üretemediğimi varsayarak neyin boş olduğunu göremiyorum.

Bu yüzden sorum şu: Bu yığın izlemesi boş bir değere neden olmak için 'a' değişkeni null nesnesine mi?

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

(yani yazabiliriz) ya da gelen dökme 'bir' 'bölüm' boş bir nesne neden nasıl? ben tarif ettiği sorunun bir 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

Daha ilginç olan soru: GetType neden çağırmıyor olsanız da neden yığındadır? OnSectionParameterChanged gövdesini yayınlayın. Belirtilmiş ve GetType olarak adlandırılmış olabilir. Ayrıca, GetType kendini NRE ile nasıl kilitleyebilir? Bu bir CLR hatası mı? – usr

+1

Hata ayıklamayı denediniz mi? this.OnSectionParameterChanged() 'den önce bir kesme noktası koyun ve 'a' değerinin ne olduğunu kendiniz görün ve '(Sections) a)' değerini görmek için hemen pencereyi kullanın. – DLeh

+0

sadece bir kerelik bir hata mıydı? Bu tekrarlanabilir değil mi? istisnanın, uygulamayı çalıştıran makinede başka bir sorunun belirtisi olması olabilir. – user1666620

cevap

28

çağırır daha da

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

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

     this.LoadSettingsPanel(); 
    } 

OnSectionParameterChanged edilir burada istediği gibi

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

(yani böyle bir şey yazmalıyım) aslında değildi gerçek problem. Farklı bir sitede, yığın izinin <CreateCommands>b__8 bölümünün, sorunun CreateCommands yönteminin 8. satırında olduğunu ifade ettiği okudum. Bu tam olarak bir anonim delege ile dizilmişti ve hata raporundaki davranışla nasıl eşleştiğini görebiliyordum.

Aslında Microsoft SDK'leri \ Windows \ v7.0A \ Bin

\ Program Files (x86 \

bulunabilir IL DASM() kullanarak benim sorununa çözüm bulundu

ve çalıştırılan EXE çalıştı ve ne olduğunu buldum. Net düşünce b__8 aslında oldu. Bu açıkça .GetType() çağıran başka bir anonim temsilci olduğu ortaya çıktı, bu yüzden aslında gerçekten çok kolay olduğunu anladım sorun ne gerçekten b__8 aslında ne anlama geldiğini.

İlgili konular