gpt4 book ai didi

C# 试图访问一个对象的属性抛出异常

转载 作者:太空宇宙 更新时间:2023-11-03 17:12:04 24 4
gpt4 key购买 nike

所以我开始学习面向对象编程,但我在理解所有这些元素之间的关系时遇到了一些困难。

我正在构建一个带有 RPG 风格战斗的简单文字游戏。

为此我有几个类,包括一个用于:

武器:

class Weapon
{
private string _name;
private int _mindamage;
private int _maxdamage;

public string Name { get { return _name; } set { _name = value; } }
public int MaxDamage { get { return _maxdamage; } set { _maxdamage = value; } }
public int MinDamage { get { return _mindamage; } set { _mindamage = value; } }

public Weapon(int mindamage, int maxdamage, string name)
{
this._name = name;
this._mindamage = mindamage;
this._maxdamage = maxdamage;
}
}

字符:

class Character
{
private string _name;
private int _life;
private Weapon _weapon;

public string Name { get { return _name; } set { _name = value; } }
public int Life { get { return _life; } set { _life = value; } }
public Weapon Weapon { get { return _weapon; } set { _weapon = value; } }

public Character(string name, Weapon weapon)
{
_name = name;
_weapon = weapon;
_life = 100;
}

还有我正在努力解决的问题:这是一个表示列表中一组字符的类:

class Company
{

private int _size;
private List<Character> _members;

public int Size { get { return _size; } set { _size = value; } }
public List<Character> Members { get { return _members; } set { _members = value; } }

public Company(string[] names, Weapon[] weapons)
{
int length = names.Length;
List<Character> _members = new List<Character>();
for (int i = 0; i < length; i++)
{
_members.Add(new Character(names[i], weapons[i]));
Console.WriteLine("added {0} to character list", _members[i].Name);
}
Console.WriteLine("characters {0} and {1} exist after the for", _members[0].Name, _members[1].Name);
_size = length;
}

}

这段代码编译得很好,但是当它执行时,如果我尝试访问列表中的角色名称,它会在我的 Program.cs 类中抛出一个错误,例如:

static void Main(string[] args)
{
Weapon anduril = new Weapon(55, 80, "Anduril");
Weapon hache = new Weapon(25, 60, "hache");
Weapon lame = new Weapon(30, 50, "lame");
Weapon arc = new Weapon(30, 40, "arc");
string[] gentils = { "Aragorn", "Legolas", "Gimli" };
string[] méchants = { "Lurtz", "Berserk", "UrukA" };
Weapon[] armes = { anduril, arc, hache };
Weapon[] armes2 = { lame, lame, arc };
Company Communauté = new Company(gentils, armes);
Company Uruks = new Company(méchants, armes2);
Console.WriteLine(Communauté.Members[0].Name);

最后一行抛出一个空对象错误。如您所见,我在我的 Company 构造函数中放置了一些 Console.WriteLine 调用,以确保构造函数实际上将 Character 添加到 >List,它起作用了。那么问题是什么?

这与我为 Members 编写 getter/setter 的方式有关吗?

最佳答案

List<Character> _members = new List<Character>();

这声明了一个名为 _members新本地,但您打算做的是初始化字段 _members。该字段从未初始化,因此当您访问其成员时,会出现空引用异常。

所以不要那样做。应该是

this._members = new List<Character>();

或者更好的是,在声明中对其进行初始化

但真正要点是:今天是学习使用调试器的好日子。您对程序的作用有一定的假设。这些假设是错误的。通过在调试器中观察程序并在每一步验证您的假设是否有效,您将很快找到错误。盯着代码看一个小时,然后放弃,问 Stack Overflow 与在调试器中运行代码相比,这是一种非常糟糕的调试技术。打印出程序的状态是很好的第一步,但实际观看程序运行会更好。

关于C# 试图访问一个对象的属性抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com