C# UWP天气程序访问嵌套列表时出现空引用异常
解决UWP中WeatherPage访问嵌套列表时的空引用异常
看起来你遇到的是典型的空引用异常,结合你描述的场景——GetWeather里填充了数据但其他类引用时为null,大概率是实例共享、属性定义或者异步加载的问题,我给你一步步拆解排查和解决方法:
1. 先确认myForecast实例是否一致
首先要排查:你在GetWeather方法中填充数据的那个Forecast实例,和WeatherPage里访问的myForecast是不是同一个对象?
- 如果
WeatherPage里是重新new了一个Forecast对象,那它的mysortedDays自然是null,因为你填充的是另一个实例的数据。 - 解决:确保
WeatherPage拿到的是已经执行过GetWeather的那个实例,比如通过构造函数传递、依赖注入,或者用单例模式(如果适合你的场景)。
2. 检查mysortedDays的属性定义是否正确
你猜测需要setter是对的,很可能是属性的访问修饰符或者初始化有问题:
- 错误示例:如果属性只有getter没有setter,或者setter是private,那外部无法赋值,或者初始化时没创建实例:
// 错误:没有setter,或者未初始化 public List<List<WeatherDay>> mysortedDays { get; private set; } // 或者根本没初始化 public List<List<WeatherDay>> mysortedDays { get; set; } - 正确做法:给属性添加public的setter,并且最好在声明时就初始化空列表,避免后续赋值前为null:
另外,在public List<List<WeatherDay>> mysortedDays { get; set; } = new List<List<WeatherDay>>();GetWeather里填充数据时,要确保是给这个属性赋值,而不是创建局部变量覆盖:// 正确:给当前实例的mysortedDays赋值 this.mysortedDays = sortedData; // sortedData是你处理好的嵌套列表 // 或者如果是填充已有列表: this.mysortedDays.Clear(); this.mysortedDays.AddRange(sortedData);
3. 排查异步加载的时序问题(UWP常见)
如果GetWeather是异步方法(比如调用天气API时用了async/await),那很可能你在WeatherPage中访问mysortedDays的时候,GetWeather还没执行完成,导致数据还没填充:
- 解决:确保在等待
GetWeather完成后再访问数据:
如果是UI场景,还可以考虑用// 在WeatherPage中调用GetWeather时要await await myForecast.GetWeather(); // 等数据加载完成后再打印 Debug.WriteLine("DEBUG IN WEATHERPAGE: " + myForecast.mysortedDays[1][1].desc);ObservableCollection替代List,这样数据更新时UI会自动响应,也能避免提前访问空数据的问题。
4. 额外的安全检查
即使前面的问题都解决了,也建议在访问嵌套列表时加空值和索引检查,避免后续出现其他异常:
if (myForecast?.mysortedDays != null && myForecast.mysortedDays.Count > 1 && myForecast.mysortedDays[1].Count > 1) { Debug.WriteLine("DEBUG IN WEATHERPAGE: " + myForecast.mysortedDays[1][1].desc); } else { Debug.WriteLine("数据未加载完成或索引越界"); }
先按照这几个步骤排查,应该就能解决空引用的问题了。
内容的提问来源于stack exchange,提问作者MidnightP
相关产品推荐
相关产品推荐

