2014-12-29 2 views
-2

Изображение VB.NET Listbox: http://i.epvpimg.com/FTSsf.pngSystem.ArgumentOutOfRangeException

Итак, у меня есть этот код для приватного Messages приложение:

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: Индекс и длина должны ссылаться на местоположение внутри строки. " только если список содержит более двух элементов.

ответ

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 

Перед обработкой строк, убедитесь, что они отвечают предположения, сделанные в коде. Если они не соответствуют этим предположениям, то код не может их обработать, а что-то еще нужно сделать. (Это может быть так просто, как просто показать сообщение пользователю или даже тихо игнорировать и продолжать.)

+0

Когда я вызываю msgbox (sp), он показывает pm, а msgbox (sp.lenght) показывает длину от pm, например, 34 –

+0

@AlexandruToma: Когда вы проходите это через отладчик, какая строка выдает фактическое исключение? Каковы значения времени выполнения, когда это происходит? Не предполагайте, что строки верны, ясно, что один из них - нет. – David

+0

Dim us As String = sp.Substring (21, sp.IndexOf (":")), а длина sp равна 34 –

Смежные вопросы