【问题标题】:String.Substring Method (Int32, Int32) throws ArgumentOutOfRangeExceptionString.Substring 方法 (Int32, Int32) 抛出 ArgumentOutOfRangeException
【发布时间】:2013-09-26 01:48:36
【问题描述】:

我有一个字符串,其中前 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。我该如何解决这个问题?

【问题讨论】:

  • 确定您的输入始终至少包含 5 个字符吗?失败时在调试或输出中运行它。 (另外,你在修剪空格吗?也许这就是它的原因。你的初始值是长度 5 或更多,然后你修剪减少它的长度。)
  • @mafap 好的,第四次,您需要找出inData 是什么。您的代码根本不会使用您提供的值抛出 ArgumentOutOfRangeException
  • 我过去也遇到过这个问题。问题是子字符串是不友好的,它不使用智能。它完全按照您的要求执行,如果输入字符串太大或太小,它会引发异常。
  • 哎呀,我忘记了字符串末尾的 } 括号。尝试 indata.Substring(5, indata.Length - 6) 代替。这将获取从第 5 个索引到最后一个字符的所有字符。

标签: c# winforms substring argumentexception


【解决方案1】:
string origMsg = inData.Substring(4, 1);

"startIndex 不能大于字符串长度"

换句话说,

4 不能大于 inData 的长度

4大于inData的长度

inData.Length 小于 4

【讨论】:

  • 对我来说非常合理的逻辑
【解决方案2】:

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

        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}{..." 中?

【讨论】:

  • 是的,类似的,但现在已经解决了。就像我在上一条评论中所说的那样,这与inData.Substring(5, inData.Length - 8); 一起使用,inData 至少等于"{1112}\r\n"。对于 if-else 语句,我使用了inData.StartsWith("some_text_15_ch")
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2012-08-30
    • 2022-11-14
    相关资源
    最近更新 更多