2012-03-23 22 views
-4

私のクラスは次のようになります。クラス内のclss、null参照例外、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;} 
} 

ただし、Warningsインスタンスを作成しようとすると、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

+1

どの行が例外をスローしますか?どのリファレンスが 'null'ですか? – svick

+3

ヌルとは何ですか? 'インスタンス'? '警告[i]'? 'allWarnings [i]'? 'ctlWarningGroupBoxFixedHeader1'? 'ヘッダー'?これより多くの情報を与える必要があります... – TDaver

答えて

5

LogSettings.warningsは配列として初期化されますが、配列要素は初期化されません。あなたが行うと

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

この:

はLogSettingsコンストラクタで配列項目を仮調印考えてみましょう(それらへの参照をいうか)あなたが3つの警告のためのスペースを持つ配列を作成

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

オブジェクト。実際に警告を生成するわけではありません。この行の後、Warnings [0]はすべてnullです。

+0

私はこれを前に試しました。この解決策は機能しませんでした。申し訳ありません – user781700

+0

@ user781700:前に何を試しましたか?あなたが間違っていたことを私はあなたに伝えていた。私はそれを正しく行う方法を理解するためにあなたにそれを残しました。 –

2

この行は、任意の警告オブジェクトを作成しません:

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

アレイ内のすべての参照がnullに初期化されます。あなたは警告の配列ではなく、配列のeleemntsを初期化LogSettingsで

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

を:あなたはそれらのオブジェクト上の任意のプロパティにアクセスしようとする前に、実際には最初のいくつかのオブジェクトを作成する必要があります。それぞれの要素を初期化する必要があります。

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を愛します。