Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Индекс находился за пределами массива [VB.NET]

Автор вопроса: Varo StudioОтветов: 1

Привет, я новичок в VB и в процессе обучения. Эта ошибка иногда возникает, а иногда не возникает, что мне кажется странным. Я получаю сообщение об ошибке Index was outside the bounds of the array, которое указывает на Button30.Text = Split(newestversion, vbCrLf)(**1**)

Мой мотив состоит в том, чтобы читать строку за строкой из текстового файла, размещенного в Интернете. Например,

label1.text = line 1 of the text file
label2.text = line 2 of the text file

Это очень то, чего я хочу.

Вот мой текущий код (ОТРЕДАКТИРОВАНО):

Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("direct link to my online txt file")
Dim response As System.Net.HttpWebResponse = request.GetResponse

Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream)

Dim stringReader As String

        stringReader = sr.ReadLine()
        Button10.Text = stringReader


        Dim newestversion As String = sr.ReadToEnd
        Dim currentversion As String = Application.ProductVersion

        Dim part() As String = Split(newestversion, vbCrLf)

        If part.Length < 10 Then
            ' not enough items in the array. You could also throw and exception or do some other stuff here
            Label10.Text = "beta"
            Exit Sub
        End If


        'updates new episode numbers on buttons
        Button20.Text = part(0)
        Button30.Text = part(1)
        Button40.Text = part(2)
        Button50.Text = part(3)
        Button60.Text = part(4)
        Button70.Text = part(5)
        Button80.Text = part(6)
        Button90.Text = part(7)
        Button100.Text = part(8)
        Button110.Text = part(9)

    End If

Благодарю вас!!

  • Как следует из ошибки, ваша переменная newestversion состоит из недостаточного количества строк. WeSt 18.02.2015
  • Вместо этого используйте System.IO.File.ReadAllLines(). Обратите внимание на свойство Length возвращаемого массива, если оно слишком мало, значит файл содержит мусор. Hans Passant 18.02.2015

visual-studio

Ответы

Ответ 1 · рейтинг 1 · WeSt

Вы разделили String на line breaks. Это дает вам массив с одной записью для каждой строки в String. Однако вы не проверяете, содержит ли этот массив ожидаемое количество элементов. Вы можете сделать:

Dim newestversion As String = sr.ReadToEnd
Dim currentversion As String = Application.ProductVersion

Dim part() As String = Split(newestversion, vbCrLf)

If part.Length < 10 Then
    ' not enough items in the array. You could also throw and exception or do some other stuff here
    MsgBox(String.Format("Array only has {0} items", part.Length))
    Exit Sub
End If

'updates new episode numbers on buttons
Button20.Text = part(0)
Button30.Text = part(1)
Button40.Text = part(2)
...

Изменить для обновленного вопроса

Если у вас есть подобная проблема, просто подойдите к ней систематически и соберите как можно больше информации. Сначала вы должны проверить, действительно ли вы получаете нужные данные из удаленного источника. Для этого добавьте журнал (например, MsgBox(newestversion) или настоящий файл журнала). Проверьте, соответствуют ли полученные данные вашим ожиданиям. Если нет, то уже есть проблема с вашим кодом запроса/ответа, которая полностью отличается от той, для которой я предоставил решение. Если newestversion в порядке, проверьте, работает ли разделение, распечатав массив part(). Возможно, сервер использует другую операционную систему или просто использует vbCr в качестве новой строки, а не vbCrlf. Если разделение также работает, все готово.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы