将项目添加到列表<t> </t>时出现异常

时间:2014-02-19 23:54:49

标签: c# .net arrays arraylist

当代码到达_match.Players2.Add(_hero);

时,我总是得到“myapp.exe中出现'System.NullReferenceException'类型的未处理异常”

我不知道为什么,我初始化_match以及_hero,当我调试时,我发现没有空值。我不知道为什么我会得到这个例外,我错过了什么?

这是我的代码:

public static List<MyDotaClass.MatchHistory> GetMatchHistory(string uri)
{
    var HeroCollection = new List<MyDotaClass.DotaHero>();
    var MatchCollection = new List<MyDotaClass.MatchHistory>();

    string response = GetDotaWebResponse(uri);
    dotadata.Dota.MatchHistoryRootObject matches = JsonConvert.DeserializeObject<dotadata.Dota.MatchHistoryRootObject>(response);
    foreach (var match in matches.result.matches)
    {
        var _match = new MyDotaClass.MatchHistory();
        _match.MatchID = match.match_id.ToString();

        foreach (var player in match.players)
        {
            var _hero = new MyDotaClass.DotaHero();

            foreach(var h in heros)
            {
                if(player.hero_id.ToString().Equals(h.HeroID))
                {
                    _hero.HeroName = h.HeroName;
                    _hero.HeroNonCleanName = h.HeroNonCleanName;
                    _hero.HeroID = h.HeroID;
                    _match.Players2.Add(_hero);
                }
            }
        }
        MatchCollection.Add(_match);
    }
    return MatchCollection;
}

public class MyDotaClass
{
    public class DotaHero
    {
        public string HeroName { get; set; }
        public string HeroNonCleanName { get; set; }
        public string HeroID { get; set; }
    }

public class MatchHistory
{
    public string MatchID { get; set; }
    //public List<DotaHero> Players { get; set; }
    public List<MyDotaClass.DotaHero> Players2 { get; set; }
}

更新:

对于那些对Dota感兴趣的人,我丢失了所有原始代码,因此我正在重写并尽力制作一个教程。 http://uglyvpn.com/2014/07/21/dota-2-net-c-tool-pt1/

3 个答案:

答案 0 :(得分:2)

确保Players2中的列表已正确初始化。 可以在你的foreach循环中完成,如下所示:

foreach (var match in matches.result.matches)
{
    var _match = new MyDotaClass.MatchHistory();
    _match.MatchID = match.match_id.ToString();
    _match.Players2 = new List<MyDotaClass.DotaHero>();
    ...

但这不是一个很棒的设计。在MatchHistory构造函数中初始化它会更健壮,如下所示:

public class MatchHistory
{
    public string MatchID { get; set; }

    //public List<DotaHero> Players { get; set; }

    public List<MyDotaClass.DotaHero> Players2 { get; private set; }

    public MatchHistory() {
        this.Players2 = new List<MyDotaClass.DotaHero>();
    }
}

请注意,我在这里也设置了setter private,因为在构造函数中初始化之后,不需要修改此属性的值。

答案 1 :(得分:1)

您已初始化MatchHistory实例但未初始化Players2属性,因此它仍为空。

您可能希望在构造函数中分配它,尽管还有其他选项;

public MatchHistory()
{
    Players2 = new List<MyDotaClass.DotaHero>();
}

PS LoL&gt; Dota:p

答案 2 :(得分:1)

看起来你的Players2集合没有实例化,所以先做

this.Players2 = new List<MyDotaClass.DotaHero>();

然后你就可以参考并使用它了:

_match.Players2.Add(_hero);

至于实例化它的位置,请在MatchHistory的构造函数中执行:

public MatchHistory() {
    this.Players2 = new List<MyDotaClass.DotaHero>();
}

这是一个很好的做法,因为下次,即使您忘记实例化它,构造函数也会自动为您完成。

否则,你会不断获得:System.NullReferenceException

<强>更新

您不能在this上下文中使用static,更改此方法以便从构造函数实例化中享受:

public static List<MyDotaClass.MatchHistory> GetMatchHistory(string uri)

到此:

public List<MyDotaClass.MatchHistory> GetMatchHistory(string uri)