VB.net Object Array выдает исключение - PullRequest
2 голосов
/ 25 февраля 2012

Я получаю исключение при выполнении следующего кода.

Public Function getSongs() As Song()
   ' Dim dir As New DirectoryInfo(Application.ExecutablePath)
     Dim dir As New DirectoryInfo(directory)
     Dim songsInDir() As Song = Nothing
     Dim i As Integer = 0
     For Each file As FileInfo In dir.GetFiles()
        'only read ".mp3" files
        If file.Extension = ".mp3" Then
            songsInDir(i) = New Song(file.Name)
            i = +i
        End If
    Next
    Return songsInDir
End Function

Я получаю сообщение об ошибке:

songsInDir(i) = New Song(file.Name)

Я получаю необработанное исключение, которое говорит:

"Ссылка на объект не установлена ​​для экземпляра объекта."

Объект песни имеет:

Public Sub new(By Val filename as String)

... sub, который устанавливаетпеременная и получает информацию о файле (этот код работает)

Любая помощь будет оценена!

Ответы [ 3 ]

2 голосов
/ 25 февраля 2012

Попробуйте использовать список:

Public Function getSongs() As Song()
  Dim dir As New DirectoryInfo(directory)
  Dim songsInDir() As New List(of Song)
  For Each file As FileInfo In dir.GetFiles()
    'only read ".mp3" files
    If file.Extension = ".mp3" Then
      songsInDir.Add(New Song(file.Name)
    End If
  Next
  Return songsInDir.ToArray()
End Function
0 голосов
/ 25 февраля 2012

Ваша проблема в том, что массивам нужен размер, когда они инициализируются, и установка его в Ничто не дает вам именно этого.Дайте массиву размер и не устанавливайте его в Nothing.Кроме того, есть намного более чистый способ сделать это.

Public Function getSongs() As Song()
    Dim songFiles As String() = Directory.GetFiles(directory, "*.mp3")
    Dim songsInDir(songFiles.Length) As Song
    Dim i As Integer = 0
    For Each file As String In songFiles
        songsInDir(i) = New Song(Path.GetFileName(file))
        i = +i
    Next
    Return songsInDir
End Function 
0 голосов
/ 25 февраля 2012

Вы должны указать размер массива

Dim i as Integer = dir.GetFiles (). Count или dir.FilesCount ()

Dim songsInDir (i) As Song = Nothing

или вы можете использовать динамический массив

поместите эту строку в цикл for

ReDim Сохранить песни InDir (i)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...