2014-11-21 2 views
1

Я получаю индекс был вне границ, за исключение массива на этой линииSystem.IndexOutOfRangeException: Индекс находился вне границ массива геокодирования-апи

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

ответ

1

Очевидно, что вы выходите за пределы исключения массива, потому что пытаетесь получить доступ к myCoordenates.Results[0], но myCoordenates.Results не имеет элементов. Всегда проверяйте, равен ли myCoordenates.Results, и если myCoordenates.Results содержит любые элементы перед доступом к myCoordenates.Results[0]. Кроме того, необходимо проверить, если 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.Length больше n если вы хотите получить доступ к 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 
}