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

标签 c# object

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

我正在构建一个带有 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/

相关文章:

c# - Vista 风格的资源管理器/文件夹 View

foreach 循环中的 C# Expression.PropertyOrField

javascript - 对对象数组进行分组的最有效方法

java - 在java中使用一个类

c++ - 在 C++ 中使用 OpenMP 并行化算法

javascript - 根据嵌套对象数组中的动态键过滤数组

c# - 防止用户在 C# 中打印/保存 PDF 文件

C# 动态扩展一个对象

c# - 我必须处理 Polly 中的异常,我需要将结果集中的数据与 Cosmos 数据库中的数据进行比较,然后重试

javascript - 对象属性名称作为数字