你调用的对象是空的。我需要一个构造函数吗?

时间:2011-11-24 05:50:08

标签: c#

OOP初学者在这里,我的问题是当我参加这个活动时:

    private void button1_Click(object sender, EventArgs e)
    {
        progressBar2.Increment(-25);
        splitContainer1.Panel1.Enabled = false;
        Thread.Sleep(2100);
        int preAttack = myCurrentOpponent.SetAttack();
        oppAttack = myCurrentOpponent.Attack(preAttack);
        progressBar1.Increment(oppAttack.dommage);
        textBox1.Text += myCurrentOpponent.Name + "Used " + oppAttack.AttackName;

    }

我收到错误:对象引用未设置为对象的实例。 你需要知道的事情 myCurrentOpponent 是一个在3个怪物类型的集合中随机选择的对象。我将使用 Gollum 这个例子,它是3种类型中的一种。 Gollum继承自Monster并覆盖 Name Level Health PreAttack SetAttack 来自基地。

    public abstract class Monster
{
    public abstract string Name { get; }
    public abstract int Lv { get; }
    public abstract int Hp { get; }

    public abstract int SetAttack();
    public abstract Attack Attack(int x);


    public Monster()
    {
    }
}

这里没有设置因为:

    public class Gollum : Monster
{
    Attack[] myAttack = new Attack[4];

    public override string Name
    {
        get
        {
            return "Gollum";
        }

    }

    public override int Hp
    {
        get
        {
            return 100;
        }
    }
    public override int Lv
    {
        get
        {
            return 3;
        }
    }

    public override int SetAttack()
    {

        Random randnum = new Random();


        int x = randnum.Next(5);

        myAttack[0].AttackName = "Charge";
        myAttack[0].dommage = -10;
        myAttack[1].AttackName = "Scratch";
        myAttack[1].dommage = -12;
        myAttack[2].AttackName = "Throw Rock";
        myAttack[2].dommage = -15;
        myAttack[3].AttackName = "Strangle";
        myAttack[3].dommage = -16;
        return x;
    }
    public override Attack Attack(int x)
    {
        return myAttack[x];
    }

    public Gollum()
    {
    }

所有东西都设置在3个怪物子类中。现在,让我们说选择的怪物是Gollum,一旦编译器到达这一行,我就点击按钮1 ......

     myAttack[0].AttackName = "Charge";

......从这条线上呼唤......

    int preAttack = myCurrentOpponent.SetAttack();

......我收到错误。 我错过了 Gollum Class 的构造函数吗?如果我是如何编码它 因为一切都直接在酒店设置。 我真的希望有人可以帮我这个,因为我真的不知道在哪里看。 希望这很清楚,并且毫不犹豫地询问您是否需要更多代码行。 提前致谢

2 个答案:

答案 0 :(得分:3)

您将数组声明在类的顶部

 Attack[] myAttack = new Attack[4]; 

但所有这一切都是创建一个包含4个插槽的数组,每个插槽都填充该类型的默认值。对于类,该默认值为null。您需要初始化这些插槽。对于数组,通常可以在循环中执行此操作。

for (int index = 0; index < myAttack.Length; index++)
{
    myAttack[index] = new Attack();
}

由于您的数组元素未实例化,因此当您尝试访问元素的成员时,会在运行时遇到NullReferenceException

答案 1 :(得分:1)

你没有用任何对象填充ar myAttack。初始化数组时,它是使用null引用创建的。您需要在出现错误的行之前添加这些行:

myAttack[0]=new Attack();
myAttack[1]=new Attack();
myAttack[2]=new Attack();
myAttack[3]=new Attack();

这会使用新的Attack对象初始化每个数组条目,以便您现在可以在它们上设置属性。