类型' System.NullReferenceException'的例外情况发生在UWP-Weather-App.exe中,但未在用户代码中处理

时间:2016-10-22 11:07:33

标签: c# api xaml uwp

我一直在关注使用API​​密钥的UWP Weather应用程序的教程。

我得到System.NullReferenceException

这是它在以RootObject

开头的行中发生的方法
namespace UWP_Weather_App
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            RootObject myWeather = await OpenWeatherMapProxy.GetWeather(20.0, 30.0);
            ResultTextBlock.Text = myWeather.name + " - " + myWeather.main.temp + " - " + myWeather.weather[0].description;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

根据您的说明,我假设您正在关注此UWP Weather tutorial。我在本教程source code中使用了您的代码并重现了您的问题。

System.NullReferenceException行发生ResultTextBlock.Text = myWeather.name + " - " + myWeather.main.temp + " - " + myWeather.weather[0].description;错误 enter image description here

这是因为您在GetWeather方法中使用的网址不对。此网址返回的结果不包含天气信息,当它反序列化为RootObject时,大多数属性都将为空。
enter image description here

要按地理坐标检索当前天气数据,我们可以使用以下API:

api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}

从2015年10月9日开始,此API需要有效的APPID才能访问。有关详细信息,请参阅Call current weather data for one locationHow to use API key in API call

因此,我们可以更改GetWeather方法,如下所示来修复此错误。

public async static Task<RootObject> GetWeather(double lat, double lon)
{
    var http = new HttpClient();
    var response = await http.GetAsync($"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={APIKEY}&units=metric");
    var result = await response.Content.ReadAsStringAsync();
    var data = JsonConvert.DeserializeObject<RootObject>(result);
    return data;
}

请注意,我尝试使用您的API密钥,但我遇到401 Invalid API key错误,因此请确保您使用正确的密钥。另外,我们需要将Main.pressureWind.deg的类型更改为double,因为它们的值不是int。如果我们不改变类型,我们可能会在反序列化时获得Newtonsoft.Json.JsonReaderException