String.Substring方法(Int32,Int32)抛出ArgumentOutOfRangeException

时间:2013-09-20 15:40:24

标签: c# winforms substring argumentexception

我有一个字符串,其中前5个字符从不为空,从char 6到结束数据是可变的。像这样:

string inData = comPort1.ReadExisting();
//Console.WriteLine("inData: " + inData);
string origMsg = inData.Substring(4, 1);
//Console.WriteLine("origMsg: " + origMsg);
string seAnex = inData.Substring(5, 15);           // ArgumentOutOfRangeException
inData = inData.Substring(5, inData.Length - 8);
//Console.WriteLine("new inData: " + inData);

if (seAnex == "some_text_15_ch")
{
    //...
}
else
{
    //...
}

输出:

inData: {1112Test}
origMsg: 2
new inData: Test

此代码抛出ArgumentOutOfRangeException: Index and length must refer to a location within the string。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

string origMsg = inData.Substring(4, 1);

“startIndex不能大于字符串长度”

换句话说,

4不能大于inData的长度

4大于inData的长度

inData.Length小于4

答案 1 :(得分:1)

我不确定你想用你的代码做什么。但是,如果只是为了解决异常。你可以像这样解决:

        string inData = comPort1.ReadExisting();
        //Console.WriteLine("inData: " + inData);
        if (inData.Length >= 5)
        {
            string origMsg = inData.Substring(4, 1);
            //Console.WriteLine("origMsg: " + origMsg);
            //string seAnex = inData.Substring(5, 15);           // ArgumentOutOfRangeException
            string seAnex = inData.Substring(5, inData.Length - 5);
            //inData = inData.Substring(5, inData.Length - 8);
            //Console.WriteLine("new inData: " + inData);

            if (seAnex == "some_text_15_ch")
            {
                //...
            }
            else
            {
                //...
            }
        }

我猜你的目的是从一条消息中获取数据信息的格式如"{111abcxzy}"在从COM通信中收到的长数据字符串"{111abcxzy}{111abcxzy}{..."中?

答案 2 :(得分:0)

我敢打赌你没有你说的字符串价值。如果它实际上是5个字符长,那么当你在它上面调用SubString(4,1)时,你就不会有ArgumentOutOfRange异常。打印出值或在调试器中检查以确认