拆分 – 索引超出了数组的范围

我使用以下代码分割字符串并存储它:

string[] proxyAdrs = linesProxy[i].Split(':'); string proxyServer = proxyAdrs[0]; int proxyPort = Convert.ToInt32(proxyAdrs[1]); if(proxyAdrs[2] != null) { item.Username = proxyAdrs[2]; } if (proxyAdrs[3] != null) { item.Password = proxyAdrs[3]; } 

问题是我得到了

指数数组的边界之外。

proxyAdrs[2]不存在时。

有时,proxyAdrs [2]有时候不在那里。

我怎么解决这个问题?

只需检查if语句中返回的数组的长度

 if( proxyAdrs.Length > 2 && proxyAdrs[2] != null) { item.Username = proxyAdrs[2]; } 

您获得exception的原因是split返回的数组小于您正在访问的索引。 如果要访问数组元素2那么数组中必须至少有3元素,因为数组索引以0开头

您可以在通过索引访问其元素之前检查数组的长度。

更改

  if(proxyAdrs[2] != null) { item.Username = proxyAdrs[2]; } 

  if(proxyAdrs.Length > 2 ) { item.Username = proxyAdrs[2]; } 

试试这个:

  string[] proxyAdrs = linesProxy[i].Split(':'); string proxyServer = proxyAdrs[0]; int proxyPort = Convert.ToInt32(proxyAdrs[1]); if(proxyAdrs.Length > 2 && proxyAdrs[2] != null) { item.Username = proxyAdrs[2]; } if (proxyAdrs.Length > 3 && proxyAdrs[3] != null) { item.Password = proxyAdrs[3]; } 

在尝试下标可能不存在的项目之前,请检查proxyAdrs的长度。

 if ( proxyAdrs.Length > 1 ) { item.Username = proxyAdrs[2]; } 

这是你的i可能低于你试图设置为2的索引:)

if i >= 2那么你可以做以下所有:—-

 if(proxyAdrs[2] != null) { item.Username = proxyAdrs[2]; } if (proxyAdrs[3] != null) { item.Password = proxyAdrs[3]; } } else I suggest you get out :D 

但同样,检查proxyAdrs.Lenght将是最好的。

根据您是否形成传入数据(变量linesProxy ),有两个选项可以帮助您:

  1. 如果确实形成了传入数据:始终包含字符串的所有部分。 在您的情况下,如果没有提供第二个值,请始终确保您有4个(假设proxyAdrs[3]是最后一个)部分,通过添加额外的:在第1和第3个值之间。 因此,在.Split()操作(确保你没有激活RemoveEmptyStrings选项)之后,你的proxyAdrs[2]将为null ,你的样本就可以了。
  2. 否则:如果proxyAdrs[2]是唯一可以为空的部分,则代码片段可以防止崩溃:

     string[] proxyAdrs = linesProxy[i].Split(':'); string proxyServer = proxyAdrs[0]; int proxyPort = Convert.ToInt32(proxyAdrs[1]); if(proxyAdrs.Length > 3) { if(proxyAdrs[2] != null) item.Username = proxyAdrs[2]; if (proxyAdrs[3] != null) item.Password = proxyAdrs[3]; } else { if(proxyAdrs[2] != null) item.Password = proxyAdrs[2]; } 
 try { objCommonDD = new CommonDropDownBLL(); objCommonDDEntity = new CommonDropdownEntity(); //string strState=contextKey.ToString(); string[] contextKeySplit = contextKey.Split('^'); string strState = contextKeySplit[0].ToString(); string strPin = contextKeySplit[1].ToString(); objCommonDDEntity.TableName = "PCOM_PINCODES"; objCommonDDEntity.DeleteField = ""; objCommonDDEntity.TextField = "RTRIM(PIN_CITY_NAME) AS PC_DESC"; objCommonDDEntity.ValueField = "DISTINCT PIN_CITY_CODE AS PC_CODE"; objCommonDDEntity.StrCondition = " AND PIN_COUNTRY_CODE='IND' AND UPPER(PIN_CITY_NAME) LIKE UPPER('" + prefixText + "%') AND PIN_STATE_NAME='" + strState + "' AND PIN_CODE='" + strPin + "' ORDER BY PC_DESC"; DataTable dtCity = new DataTable(); dtCity = objCommonDD.GetData(objCommonDDEntity); string[] items = new string[dtCity.Rows.Count]; int i = 0; for (i = 0; i < dtCity.Rows.Count; i++) { items.SetValue(dtCity.Rows[i]["PC_DESC"].ToString(), i); } return items; }