当代码到达_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/
答案 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)