VB.NET Listbox System.ArgumentOutOfRangeException

时间:2014-12-29 16:09:18

标签: vb.net listbox

图片:http://i.epvpimg.com/FTSsf.png

所以,我的私人消息应用程序的代码是这样的:

Private Sub ReplyToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReplyToolStripMenuItem.Click

  Try
            If Not ListBoxAdv1.SelectedItem.ToString = Nothing Then
                Dim sp = ListBoxAdv1.SelectedItem.ToString()


                cru = sp.Substring(0, sp.IndexOf(":"))

                datee = sp.Substring(0, sp.IndexOf(")"))
                datee = datee.Replace("(", "")



                Dim us As String = sp.Substring(21, sp.IndexOf(":"))
                Dim pmo As String = us.Substring(0, us.IndexOf(":")).Trim
                Dim pm As New new_pm
                pm.own = pmo
                pm.Show()

            End If
        Catch ex As System.ArgumentOutOfRangeException
            MsgBox(ex.ToString)
        End Try



    End Sub

问题在于第一项,它给出了错误“System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。”仅当列表框包含两个以上的项目时才会使用。

1 个答案:

答案 0 :(得分:0)

代码在这里做了很多假设:

cru = sp.Substring(0, sp.IndexOf(":"))
datee = sp.Substring(0, sp.IndexOf(")"))

Dim us As String = sp.Substring(21, sp.IndexOf(":"))
Dim pmo As String = us.Substring(0, us.IndexOf(":"))

这些字符串是否始终保证大于这些长度?并包含这些字符?例外情况说不,他们不是。

例如,如果sp长度为0,则没有索引0(没有第一个字符),因此第一行代码将失败。如果长度不是至少22个字符,那么第三行将失败。如果它不包含":",则第一行将失败。等等。

由于您没有对字符串内容进行大量控制,因此您需要进行一些错误检查,然后使用一些业务逻辑来处理边缘情况。例如,你有这样的地方:

cru = sp.Substring(0, sp.IndexOf(":"))

您可能首先要确保sp符合您的想法。类似的东西:

If String.IsNullOrEmpty(sp) Then
    ' an error condition, notify the user perhaps?
End If

和/或类似的东西:

If sp.IndexOf(":") < 0 Then
    ' an error condition, notify the user perhaps?
End If

在处理字符串之前,请确保它们符合代码所做的假设。如果他们不满足这些假设,那么代码就无法处理它们,必须做其他事情。 (这可能就像向用户显示消息一样简单,甚至可以默默地忽略并继续。)