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

#vb.net #vb.net-2010

#vb.net #vb.net-2010

Вопрос:

Моя проблема

Индекс находился за пределами массива. когда я пытаюсь запустить код , он генерирует эту ошибку. у меня есть две формы : ВОЙТИ и ЗАРЕГИСТРИРОВАТЬСЯ , моя проблема в том, что они не работают вместе и генерируют ошибку, прикрепленную ниже

 Dim fs As New FileStream("C:UsersSelmenDesktopvblogs.txt", FileMode.Open, FileAccess.ReadWrite)  Dim sr As New StreamReader(fs)  Dim sw As New StreamWriter(fs)  Dim s As String  Dim t() As String  Dim trouve As Integer = 0  Dim tt() As String  Dim ch As String  ch = TextBox1.Text   "#"   TextBox2.Text   "#"   TextBox3.Text   "#"   TextBox4.Text   "#"   TextBox5.Text  tt = ch.Split("#")  Do While (trouve = 0) And (sr.Peek gt; -1)  s = sr.ReadLine  t = s.Split("#")  If String.Compare(t(2), tt(2)) = 0 Then  trouve = 1  End If  Loop  If (trouve = 1) Then  MsgBox("user existant")  Else   sw.WriteLine(ch)   Me.Hide()  Form4.Show()   End If  sw.Close()  sr.Close()   fs.Close()   End Sub  

Если Строка.Сравните(t(2), tt(2)) = 0, тогда я получу:

Исключение IndexOutOfRangeException не было обработано / Индекс находился за пределами массива.

Комментарии:

1. Вам нужно проверить , что в массиве t достаточно элементов для доступа t(2) , поэтому используйте что-то вроде If t.Length gt;=3 AndAlso String.Compare(t(2), tt(2)) = 0 Then .

2. Во-первых, теперь и навсегда включите опцию Строгий. Свойства проекта -gt; вкладка «Компиляция». Также для будущих проектов Инструменты -gt; Параметры -gt;gt; Проекты и решения -gt;gt;gt; VB по умолчанию

Ответ №1:

Потоки необходимо утилизировать. Вместо использования потоков вы можете легко получить доступ к текстовому файлу с помощью File класса .net.

File.ReadAllLines возвращает массив строк в файле. Мы можем перебирать строки в a Для каждого. Нижний регистр c , следующий "#" за буквой, сообщает компилятору, что вы предполагаете, что a Char не a String . String.Split ожидает Char А. Обычно String.Compare используется для упорядочения строк в алфавитном порядке. Тебе просто нужно = . Как только мы найдем совпадение, мы выйдем из цикла Exit For .

На самом деле нам не нужен массив свойств текстовых полей Text , если только нет совпадения. Помещение элементов в фигурные скобки инициализирует и заполняет массив строк.

File.AppendAllLines делает то, что он говорит. Он ожидает массив строк. Как и в случае с текстовыми полями, мы помещаем нашу строку для добавления в фигурные скобки.

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click  Dim p = "path to file"  Dim lines = File.ReadAllLines(p)  Dim trouve As Integer  For Each line In lines  Dim thirdField = line.Split("#"c)(2)  If thirdField = TextBox3.Text Then  trouve = 1  Exit For  End If  Next  If trouve = 1 Then  MsgBox("user existant")  Else  Dim tt = {TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text}  File.AppendAllLines(p, {String.Join("#", tt)})  Me.Hid3e()  Form4.Show()  End If End Sub