【问题标题】:System.IndexOutOfRangeException: Index was outside the bounds of the array geocode-apiSystem.IndexOutOfRangeException:索引超出了数组 geocode-api 的范围
【发布时间】:2014-11-21 15:44:49
【问题描述】:

我得到的索引超出了这一行数组异常的范围

string strLat = myCoordenates.Results[0].Geometry.Location.Lat.ToString();

这应该从地理编码请求中提取纬度并将其转换为字符串。

这是我用于地理编码的类,我从这里得到的:How to store geocoded address information into the database

using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Web;

public class GoogleMapsDll
{
    public class GoogleMaps
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public static GeoResponse GetGeoCodedResults(string address)
        {
            string url = string.Format(
                    "http://maps.google.com/maps/api/geocode/json?address={0}&region=dk&sensor=false",
                    HttpUtility.UrlEncode(address)
                    );
            var request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GeoResponse));
            var res = (GeoResponse)serializer.ReadObject(request.GetResponse().GetResponseStream());
            return res;
        }
    }

    [DataContract]
    public class GeoResponse
    {
        [DataMember(Name = "status")]
        public string Status { get; set; }

        [DataMember(Name = "results")]
        public CResult[] Results { get; set; }

        [DataContract]
        public class CResult
        {
            [DataMember(Name = "geometry")]
            public CGeometry Geometry { get; set; }

            [DataContract]
            public class CGeometry
            {
                [DataMember(Name = "location")]
                public CLocation Location { get; set; }

                [DataContract]
                public class CLocation
                {
                    [DataMember(Name = "lat")]
                    public double Lat { get; set; }

                    [DataMember(Name = "lng")]
                    public double Lng { get; set; }
                }
            }
        }

        public GeoResponse()
        { }
    }
}

我已多次阅读整篇文章 (What is an IndexOutOfRangeException / ArgumentOutOfRangeException and how do I fix it?) 及其部分内容,但我仍然不知道如何解决这个问题。我觉得这可能是因为我没有从我的 api 请求中得到任何结果,但我不确定如何确定。

【问题讨论】:

  • 当错误被抛出时,检查你的局部变量并查看 myCoordenates.Results 中存储的内容。您的 API 似乎没有返回任何内容。

标签: c# arrays asp.net-mvc geocode


【解决方案1】:

很明显,您超出了数组异常的范围,因为您尝试访问 myCoordenates.Results[0]myCoordenates.Results 没有元素。在访问myCoordenates.Results[0] 之前,请始终检查myCoordenates.Results 是否为空以及myCoordenates.Results 是否包含任何元素。您还需要检查myCoordenates.Results[0].Geometry 是否为空以及myCoordenates.Results[0].Geometry.Location 是否为空以避免NullReferenceException,此处也有说明:What is a NullReferenceException and how do I fix it?

if (myCoordenates.Results != null && myCoordenates.Results.Length > 0)
{
    if (myCoordenates.Results[0].Geometry != null
        && myCoordenates.Results[0].Geometry.Location != null)
    {
        string strLat = myCoordenates.Results[0].Geometry.Location.Lat.ToString();
    }
    else
    {
        // logic when myCoordenates.Results[0].Geometry is null or
        // myCoordenates.Results[0].Geometry.Location is null
    }
}
else
{
    // logic when myCoordenates.Results is null or myCoordenates.Results doesn't 
    // have any elements
}

一般来说,当myCoordenates.Results 不为空时,如果要访问myCoordenates.Results[n],则必须始终检查myCoordenates.Results.Length 是否大于n。下面是要访问myCoordenates.Results的第四个元素的示例

if (myCoordenates.Results != null && myCoordenates.Results.Length > 3)
{
    if (myCoordenates.Results[3].Geometry != null
        && myCoordenates.Results[3].Geometry.Location != null)
    {
        string strLat = myCoordenates.Results[3].Geometry.Location.Lat.ToString();
    }
    else
    {
        // logic when myCoordenates.Results[3].Geometry is null or
        // myCoordenates.Results[3].Geometry.Location is null
    }
}
else
{
    // logic when myCoordenates.Results is null or myCoordenates.Results has
    // less than four elements
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多