无法弄清楚为什么错误…对象实例没有设置为对象的实例

本文关键字:实例 对象 设置 为什么 错误 弄清楚 | 更新日期: 2023-09-27 17:50:54

对象引用未设置为对象的实例。我仍然有同样的问题…学生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;
    }

无法弄清楚为什么错误…对象实例没有设置为对象的实例

显然足够的s.Scores属性返回空值。当你把它影响到scoreS字符串变量,然后试图分割它,你得到你的异常。

这类问题很容易通过调试会话解决。另外,如果你想确保一个值不能为空,而你不知道,而你正在调试,使用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();
}

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