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 的构造函数吗?如果我是如何编码它 因为一切都直接在酒店设置。 我真的希望有人可以帮我这个,因为我真的不知道在哪里看。 希望这很清楚,并且毫不犹豫地询问您是否需要更多代码行。 提前致谢
答案 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
对象初始化每个数组条目,以便您现在可以在它们上设置属性。