2012-03-23 20 views
-4

我的課堂看起來像這樣。類內部的空問,空引用異常,C#

public class LogSettings 
{ 
    public string attributeName { get; set; }//TODO: change the variable name 

    public Warnings[] warnings = new Warnings[3]; 
} 

public class Warnings 
{ 
    public string typeOfWarning {get; set;} 

    public bool isAbsolute { get; set; } 

    public decimal numUpDownValue { get; set; } 

    public LogSettingActions[] actionItems = new LogSettingActions[10]; 
} 

public class LogSettingActions 
{ 
    public string actionItem{ get; set;} 
} 

但是當我嘗試創建警告實例時,它會拋出NullReference錯誤。

var rows = FindChilds<ctlLogConfigRow>(lvLogConfigTemplate); 
foreach (var row in rows) 
{ 
    LogSettings instance = new LogSettings(); 
    instance.attributeName = row.GroupHeaderText; 

    var allWarnings = FindChilds<ctlWarnings>(row); 

    for (int i = 0; i < allWarnings.Count; i++) 
    { 

     instance.warnings[i].typeOfWarning = allWarnings[i].ctlWarningGroupBoxFixedHeader1.Header.ToString();//It throws error here 

任何人都可以幫助我嗎?

+1

錯誤在哪裏?什麼線? – jrummell 2012-03-23 18:23:03

+1

哪一行引發異常? 'null'是什麼引用? – svick 2012-03-23 18:23:16

+3

什麼是空? 'instance'? '警告[I]'? 'allWarnings [I]'? 'ctlWarningGroupBoxFixedHeader1'? 'Header'?您需要提供比此更多的信息.​​.. – TDaver 2012-03-23 18:23:45

回答

5

LogSettings.warnings被初始化爲數組,但數組元素未初始化。

考慮在LOGSETTINGS構造草簽的數組項:

public class LogSettings 
{ 
    public LogSettings() 
    { 
     warnings = new Warnings[3]; 
     for (int i=0; i<warnings.Length; i++) 
     { 
       warnings[i] = new Warnings(); 
     } 
    } 

    public string attributeName { get; set; }//TODO: change the variable name 

    public Warnings[] warnings; 
} 
1

當你這樣做:

public Warnings[] warnings = new Warnings[3]; 

你3個警告創建空間數組對象(或者說對它們的引用) 。它實際上並沒有創建警告。在這行Warnings [0]之後是空的,所有其他的也是如此。

+0

我以前試過。這個解決方案沒有用。對不起 – user781700 2012-03-23 18:49:22

+0

@ user781700:試過之前?我在告訴你你做錯了什麼。我把它交給你來弄清楚如何做對。 – 2012-03-23 19:25:27

2

這條線不會產生任何警告的對象:

public Warnings[] warnings = new Warnings[3]; 

陣列中所有引用被初始化爲null。實際上你需要先創建一些對象,你嘗試之前,對這些對象訪問任何屬性:

for (int i = 0; i < warnings.Length; ++i) { 
    warnings[i] = new Warnings(); 
} 
0

在LOGSETTINGS你初始化數組的警告,而不是陣列的eleemnts。您需要初始化每個元素。

for (int i=0;i<3;i++) 
    warning[i] = new Warning(); 
0

線:

public Warnings[] warnings = new Warnings[3]; 

僅創建陣列,而不是陣列中的對象。到陣列中創建的Warnings情況下,這樣做:

public Warnings[] warnings = 
    Enumerable.Repeat<Warnings>(new Warnings(), 3).ToArray(); 

,並用相同的:

public LogSettingActions[] actionItems = 
    Enumerable.Repeat<LogSettingActions>(new LogSettingActions(), 10).ToArray(); 

愛是愛LINQ。