Не могу получить длину пустого массива без исключения нулевой ссылки - PullRequest
0 голосов
/ 06 июля 2019

РЕДАКТИРОВАТЬ: Я уже знаю, что такое исключение нулевой ссылки. Что я не могу понять, так это как настроить мой код так, чтобы он считывал длину пустого массива, не вызывая исключение нулевой ссылки.

У меня есть форма, которая должна добавлять элемент в набор параллельных массивов при каждом нажатии кнопки «Отправить». Мне нужен способ убедиться, что индекс увеличивается, поэтому я написал код так, чтобы он получал длину одного массива и вычитал 1, чтобы получить индекс, хранящийся в переменной. Тем не менее, для первого элемента в массиве я получаю нулевую ссылку: 'Object reference not set to an instance of an object.'

Я не уверен, что делать, так как массивы определены на уровне класса и не может иметь какие-либо значения, пока что-то не будет добавлено к ним. Я не могу просто сказать, каково значение в myArray(0), потому что оно будет перезаписываться каждый раз, когда пользователь нажимает «отправить». Как я могу заставить это работать? Спасибо за любую помощь:)

Вот мой код:

Option Strict On

Public Class frmMain

    'Declare arrays to store data
    Dim CountyAndState() As String
    Dim YearlyIncome() As Double

    Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click

        'Validate inputs and assign data to arrays
        'Reset colors for inputs
        cboCountyState.BackColor = Color.White
        txtYearlyIncome.BackColor = Color.White

        'Declare variables
        Dim strResidence As String
        Dim dblIncome As Double
        Dim intIndex As Integer

        'Validate input
        If Validation(CStr(cboCountyState.SelectedItem), txtYearlyIncome.Text) = True Then

            'Assign values to variables
            dblIncome = CDbl(txtYearlyIncome.Text)
            strResidence = CStr(cboCountyState.SelectedItem)

            'Get index for new array item
            If CountyAndState.Length > 1 Then '*****THIS IS WHERE THE ERROR OCCURS******
                intIndex = (CountyAndState.Length - 1)
            Else
                intIndex = 0
            End If

            'Add items to arrays
            CountyAndState(intIndex) = strResidence
            YearlyIncome(intIndex) = dblIncome

            MessageBox.Show(CountyAndState(intIndex))

        End If



    End Sub

1 Ответ

1 голос
/ 06 июля 2019

Я вижу несколько проблем с вашим кодом, но сейчас мы сосредоточимся на CountyAndState. Во-первых, он объявлен как массив, но никогда не инициализируется. Массив не является динамическим. Вы знакомы с указателями? Позвольте мне объяснить:

Когда вы объявляете массив из 6 элементов, VB «резервирует» достаточно места для 6 элементов в стеке. Когда вы объявляете список, VB «резервирует» достаточно места в стеке , чтобы знать, где он будет хранить информацию, содержащуюся в списке, и хранить эту информацию в куче .

Ваш массив объявлен в стеке, поэтому вам нужно заранее сообщить VB о его размере. Поскольку вы никогда не делаете этого, у вас фактически нет массива. Вот почему вы получаете NullReferenceException : вы ищете (несуществующее) содержимое массива.

С другой стороны, List(Of String) будет делать то, что вы хотите, и все равно будет динамичным. Попробуйте инициализировать его так: Dim CountyAndState As New List(Of String) и получайте удовольствие!

...