拆分 - 索引超出了数组范围。

6

我正在使用以下代码将一个字符串分割并存储:

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]不存在时,我会收到一个"Index was outside the bounds of the array."的错误提示。
有时proxyAdrs[2]存在,有时不存在。
该如何解决?
7个回答

11

只需检查在if语句中返回的数组长度即可。

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

你遇到该异常的原因是split方法返回的数组大小小于你所访问的索引值。如果你正在访问数组元素 2,那么数组中必须至少有3个元素,因为数组索引从0开始。


3
您可以在访问数组元素之前通过索引检查其长度。
更改
   if(proxyAdrs[2] != null)
   {
            item.Username = proxyAdrs[2];
   }

To

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

0

试试这个:

        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];
        }

0

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

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

0

这是因为你的i可能比你尝试设置为索引的2要小 :)

如果 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.Length会是最好的选择。


0

有两个选项可能会帮助你,具体取决于你是否形成了传入数据(变量linesProxy):

  1. 如果您正在处理传入数据:请始终包含字符串的所有部分。在您的情况下,如果第二个值未提供,请在第一和第三个值之间添加额外的“:”,以确保始终有4个部分(假设proxyAdrs [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];
    }
    

0
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;
}

欢迎来到SO,Deepika!在SO上,使用答案来提出另一个问题是不可接受的。请使用“提问”按钮来提出新问题。此内容已被标记为删除。 - JNYRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接