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]ないとき。

場合によっては、proxyAdrs[2] が存在しない場合もあります。

どうすればこれを解決できますか?

4

7 に答える 7

10

if ステートメントで返される配列の長さを確認するだけです

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

例外が発生する理由は、分割がアクセスしているインデックスよりも小さいサイズの配列を返しているためです。2配列要素にアクセスしている場合3、配列インデックスが0

于 2012-11-27T09:35:36.500 に答える
2

配列の要素にインデックスでアクセスする前に、配列の長さを確認できます。

変化する

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

   if(proxyAdrs.Length > 2 )
   {
            item.Username = proxyAdrs[2];
   }
于 2012-11-27T09:36:11.007 に答える
0

linesProxy入力データ (変数)を形成するかどうかに応じて、2 つのオプションが役立ちます。

  1. 入力データを形成する場合: 常に文字列のすべての部分を含めます。あなたの場合、2 番目の値が指定されていない場合は、1 番目と 3 番目の値の間に値proxyAdrs[3]を追加して、常に 4 つの部分 (最後であると仮定) があることを確認してください。:したがって、操作後(オプション.Split()を有効にしないようにしてください) 、サンプルは問題なく動作します。RemoveEmptyStringsproxyAdrs[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];
    }
    
于 2012-11-27T09:54:33.127 に答える
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;
}
于 2015-06-18T11:21:32.407 に答える
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];
        }
于 2012-11-27T09:36:01.143 に答える
0

proxyAdrs存在しない可能性のある項目に添字を付ける前に、 の長さを確認してください。

if ( proxyAdrs.Length > 1 ) {
  item.Username = proxyAdrs[2];
}
于 2012-11-27T09:36:08.830 に答える
0

それはあなたがインデックスとして設定しようとしている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するのが最善です。

于 2012-11-27T09:38:48.900 に答える