无法弄清楚为什么错误...对象实例未设置为对象的实例

时间:2014-03-18 20:38:58

标签: c# .net null nullreferenceexception

对象引用未设置为对象的实例。我仍然有同样的问题......学生S被传入,(学生)s.scores包含一个" 80 90 100"

的字符串
    public Student GetUpdatedScores(Student s)
    {

        txtName.Text = s.Name;  
        lstScores.Items.Clear();
        string[] listOfScores = s.Scores.Split(' '); //receiving error on this line.
        for (int i = 0; i < (listOfScores.Length - 1); i++)
        {
            lstScores.Items.Add(listOfScores[i]);
        }
        this.ShowDialog();
        return student;
    }

1 个答案:

答案 0 :(得分:2)

显然,s.Scores属性返回空值。当你将它影响到scoreS字符串变量然后尝试拆分它时,你会得到你的例外。

使用调试会话很容易解决这种问题。另外,如果您想在调试时确定某个值不能为null,请使用Debug.Assert调用。例如:

Debug.Assert(scoreS != null);

您知道这些调用不会在release编译配置中编译。

作为一个额外的建议,如果你不介意我说,你不应该只有不同的情况变量。事实上,我认为你应放弃namEscoreS,因为它们在这里完全没用。而是使用实例属性。这将使代码更容易阅读,并在此过程中帮助您在发生时自行解决这类问题。

<强>更新

以下是我将如何编写它(有一些评论进一步解释):

// renamed the function to reflect what it really should do (and does)
public DialogResult ShowUpdatedScores(Student student)
{
    // since your method is public this is rather good practice
    if (student == null) throw new ArgumentNullException("student");

    // with this, scores cannot be null while you debug without you knowing
    Debug.Assert(student.Scores != null);

    // who needs loops when there's AddRange method? :)
    lstScores.Items.Clear();
    lstScores.AddRange(student.Scores.Split(' '));

    txtName.Text = student.Name;  

    // it's pointless to return the same student pointer that was passed as a parameter, returning DialogResult makes more sense
    return this.ShowDialog();
}

当然,这是对你的代码做出一些假设,但你明白了。