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

Привет, я новичок в 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

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


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


Ответы (1)


Вы разделили 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. Если разделение также работает, все готово.

person WeSt    schedule 18.02.2015
comment
это не сработало. Он не читал и не менял текст кнопок - person Varo Studio; 18.02.2015
comment
Самый простой способ проверить, что происходит, — установить где-нибудь breakpoint и пройти через процесс. Должно произойти одно из следующего: где-то возникает исключение OR вы видите окно сообщения, а затем метод завершает работу OR кнопки имеют текст, который вы хотите, чтобы они имели. Если вы не хотите выполнять отладку, я бы посоветовал вам записать содержимое newestversion (в файл, на консоль или в окно сообщения). - person WeSt; 18.02.2015
comment
нет никакой ошибки. Приведенный выше код не показывает ошибок и не извлекает данные из текстового файла): - person Varo Studio; 18.02.2015
comment
Конечно, вы должны поместить его в нужное место в своем коде. Строка Dim newestversion As String = sr.ReadToEnd также существует в коде, который вы разместили выше. Просто вставьте код, который я вам дал, в эту позицию. Просто еще раз уточню: вам нужно использовать код, который ВЫ опубликовали, и поместить в этот код фрагменты, которые я предоставил. Вы могли заметить, что я также использую sr.ReadToEnd. Этот экземпляр sr — это тот, который вы объявили в коде своего вопроса. - person WeSt; 18.02.2015
comment
да, я думаю, что позволил мне отредактировать свой пост с новым редактированием - person Varo Studio; 18.02.2015
comment
Отредактировано, сэр. Пожалуйста помоги ): - person Varo Studio; 18.02.2015
comment
я проверил и не получил то, что я хочу. Текст всех кнопок остается по умолчанию. Часть массива тоже ничего не показала. - person Varo Studio; 18.02.2015
comment
Извините, но количество информации, которую вы предоставляете, слишком мало, чтобы помочь вам в дальнейшем. Проверьте, получаете ли вы правильный файл с сервера, и выясните, какая именно строка не делает то, что вы хотите. Самый простой способ — отладка вашего приложения. - person WeSt; 18.02.2015