2014-11-21 49 views
1

我越来越指数为数组例外的界限之外在这条线System.IndexOutOfRangeException:索引是该数组地理编码的API

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请求中得到任何结果,但我不确定如何确定。

+0

第四个元素在引发错误,检查你的局部变量,看看什么是存储在myCoordenates.Results的例子。看起来你的API没有任何返回。 – Michael 2014-11-21 15:48:33

回答

1

很明显,您会遇到阵列异常的界限,因为您尝试访问myCoordenates.Results[0],但myCoordenates.Results没有元素。总是检查myCoordenates.Results是否为空,并且如果myCoordenates.Results包含访问myCoordenates.Results[0]之前的任何元素。你还需要检查是否myCoordenates.Results[0].Geometry为null,如果myCoordenates.Results[0].Geometry.Location为null,以避免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.Lengthn大如果你想访问myCoordenates.Results[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 
} 
相关问题