Индекс вне диапазона, когда это не так. VB.net - PullRequest
0 голосов
/ 04 мая 2020

Я написал этот код на VB. net и пытаюсь понять, почему он выдает эту ошибку,

Индекс был вне допустимого диапазона. Должен быть неотрицательным и быть меньше размера коллекции.

, хотя я знаю, что индекс не выходит за пределы допустимого диапазона.

Dim logbookServer As List(Of String) = webClient.DownloadString("http://localhost/serverlogbook.csv").Split(",").ToList

If webClient.IsBusy Then
    Dim status = webClient.IsBusy
    While status = True
        status = webClient.IsBusy
    End While
End If

For i As Integer = 0 To logbookServer.Count - 1
    Dim line As List(Of String) = logbookServer(i).Split("|").ToList
    If line(1) <> "JBU" + myID.ToString Then
        logbookServer.RemoveAt(i)
    End If
Next

Это вызывает ошибку в If line(1) <> "JBU" + myID.ToString Then по ссылке line(1). Даже когда я помещал MsgBox(line(1)) в строку раньше, он возвращает соответствующее значение, а затем, когда я закрываю окно сообщения, он выдает ошибку. Я разместил несколько окон сообщений перед тем местом, где он выдает ошибку, чтобы убедиться, что там действительно есть значение, и он возвращает ожидаемое значение, включая правильную строку из logbookServer для анализа. Так что я действительно не уверен, почему он выдает ошибку.

1 Ответ

0 голосов
/ 05 мая 2020

Пожалуйста, включите Option Strict. Это процесс, состоящий из двух частей. Сначала для текущего проекта - в обозревателе решений дважды щелкните «Мой проект». Слева выберите Compile. В раскрывающемся списке Option Strict выберите ON. Второй для будущих проектов - Go в меню «Инструменты» -> «Параметры» -> «Проекты и решения» -> «Настройки VB по умолчанию». В раскрывающемся списке Option Strict выберите ON. Это убережет вас от ошибок во время выполнения.

Вам нужно go назад по списку, когда вы удаляете элементы из списка. .Split ожидает Char. Маленький c после символа, который нужно разделить, сообщает компилятору, что это Char. Хотя + будет работать как оператор конкатенации, обычно используется амперсанд (&).

    For i As Integer = logbookServer.Count - 1 To 0 Step -1
        Dim line As List(Of String) = logbookServer(i).Split("|"c).ToList
        If line(1) <> "JBU" & myID.ToString Then
            logbookServer.RemoveAt(i)
        End If
    Next
...