【问题标题】:startIndex cannot be larger than length of string. Parameter name: startIndex in vb.netstartIndex 不能大于字符串的长度。参数名称:vb.net中的startIndex
【发布时间】:2013-09-22 10:24:51
【问题描述】:

我有一段代码可以生成随机字符。问题是,每隔一段时间,它就会返回一个错误:
"startIndex cannot be greater than length of string. 参数名称:startIndex"

如何防止此类错误发生?

这是我的代码:

Friend Function gentCtrlChar()
    Dim ran As New Random
    Dim alpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim alpha2 As String = "ZYXWVUTSRQPONMLKJIHGFEDCBA"
    Dim rdm As New Random
    Dim genChar As String = ""
    For i As Integer = 1 To 52
        Dim selChar As Integer = rdm.Next(1, 28)
        Dim selChar2 As Integer = rdm.Next(1, 28)
        genChar = genChar + "" + alpha.Substring(selChar, 1) + "" + alpha2.Substring(selChar2, 1)
        On Error Resume Next
        Exit For
    Next
    Return genChar
End Function

如您所见,我尝试设置“On Error Resume Next”,希望能以某种方式为我解决错误。但可悲的是,它没有做它的工作。还是我以错误的方式或在错误的情况下使用它?

有什么帮助吗?

谢谢!

【问题讨论】:

  • 字母表/您的字母字符串中只有 26 个字符。 rdm.Next(1, 28) 将上限设置为 28(2 太多)。
  • 加上它永远不会得到字符串的第一个字符,因为第一个字符的索引是 0

标签: vb.net string random substring


【解决方案1】:

这段代码:

Dim selChar As Integer = rdm.Next(1, 28)

有时会返回一个比这个字符串的长度长(27 或 28)的数字:

Dim alpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  (only 26 characters long)

所以,当 selChar 为 26 或更大时,这是无效的。

alpha.Substring(selChar, 1)

最简单的解决方法是:

Dim selChar As Integer = rdm.Next(0, alpha.Length) 
Dim selChar2 As Integer = rdm.Next(0, alpha2.Length) 

【讨论】:

  • 这仍然需要调整。因为String.Substring 使用从零开始的索引器,所以正确的范围是rdm.Next(0, 25)。照原样,第一个字符永远不会被选中,当 26 出现时它仍然会出错。 "0123456789".Substring(1,1) 是“1”而不是“0”。
  • @Plutonix,“String.Substring 使用从零开始的索引器”是什么意思?
  • 谢谢@Plutonix ...你是对的...我已经修改了我的答案。
  • @Plutonix - rdm.Next(0, 25) 永远不会返回最后一个字符。 Next 方法的第二个参数是 exclusive 上限值。您需要 rdm.Next(0, 26) 或 BWS 显示的 rdm.Next(0, alpha.Length) 以包含所有字符。
  • @Chris - 谢谢,我不知道它是排他性的......无论如何我都不会使用文字值,但是像alpha.length 这样的东西可以避免这个问题,甚至不必知道;)
【解决方案2】:

试试这个方法。我认为它更干净,易于理解。 A - Z 与 ascii 映射上的 65 - 90 相同,因此很容易将整数转换为 Char 值。然后我们只使用字符串生成器来使其更易于阅读。

Dim rdm As New Random
Dim genChar As New StringBuilder()
For i As Integer = 1 To 52
    Dim selChar As Char = Chr(rdm.Next(65, 90))
    Dim selChar2 As Char = Chr(rdm.Next(65, 90))
    genChar.Append(selChar)
    genChar.Append(selChar2)
Next
Return genChar.ToString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多