2015-05-01 3 views
1

Я знаю, что исключение нулевой ссылки обычно возникает при доступе к элементу в коллекции, которая не существует. Тем не менее, в этом случае бросается, несмотря на то, что я явно создаю этот элемент для простых строк заранее. Я вычистить свой код и не может найти источник этой ошибки (код очень простой ATM, как я только начал процесс реструктуризации решение, сделанное для клиентаNull Reference Exception on Dictionary

Справочная информация:.

  • фоторабот является пользовательский класс, который содержит все свойства конкретного производственного задания

  • это все, проведенных в Public Dictionary(of string, PhotoJob), который проводится в классе MainForm.

  • A («темп») photojob создается в го это словарь для обработки добавления новых заданий по мере добавления данных (это, по-видимому, является источником ошибки.

Код:

Private Sub AddJob_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    MainForm.photoJobs.Add("temp", New PhotoJob()) 
    pctBox.AllowDrop = True 
End Sub 

Public Sub pctbox_drop(sender As Object, e As DragEventArgs) Handles pctBox.DragDrop 
    Dim pics As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())    'Gets the data from the file drop 
    If MainForm.photoJobs("temp").imageList.Count = 0 Then 
     MainForm.photoJobs("temp").imageList = pics.ToList     'Gets the data from the file drop 
    Else 
     For i = 0 To MainForm.photoJobs("temp").imageList.Count - 1 
      If Not MainForm.photoJobs("temp").imageList.Contains(pics(i)) Then 
       MainForm.photoJobs("temp").imageList.Add(pics(i)) 
      End If 
     Next 
    End If 

    MainForm.photoJobs("temp").photoID = CType(formatID(MainForm.photoJobs("temp").imageList(0)), String) 
    txtPhotoID.Text = MainForm.photoJobs("temp").photoID 
    Select Case MainForm.photoJobs("temp").imageList.Count 
     Case 0 
      MsgBox("Please ensure that you are dropping image files") 
     Case 1 
      lblImageNumber.Text = txtPhotoID.Text 
      checkBoxes(0) 
     Case 2 
      txtPhotoID.Text = txtPhotoID.Text & "(2)" 
      lblImageNumber.Text = txtPhotoID.Text 
      checkBoxes(1) 
     Case 3 
      txtPhotoID.Text = txtPhotoID.Text & "(3)" 
      lblImageNumber.Text = txtPhotoID.Text 
      checkBoxes(2) 
     Case 4 
      txtPhotoID.Text = txtPhotoID.Text & "(4)" 
      lblImageNumber.Text = txtPhotoID.Text 
      checkBoxes(3) 
    End Select 
    spinCounter.Value = 1 
    spinCounter.Minimum = 1 
    spinCounter.Maximum = MainForm.photoJobs("temp").imageList.Count 
    pctBox.ImageLocation = MainForm.photoJobs("temp").imageList(0) 
End Sub 

Ошибка вызывается на If MainForm.photoJobs("temp").imageList.Count = 0 Then линии.

На второй, второстепенной ноте, довольно типично для клиентов просить «еще одну маленькую вещь», которая приводит к тому, что вам необходимо провести капитальный ремонт приложения или мне просто не повезло? (слегка риторический)

+0

Возможно, 'imageList' имеет значение null, используйте отладчик, он сообщает вам все, что вам нужно знать. –

+0

'imagelist' звучит так, будто это не компонент формы ImageList, а квалифицированная коллекция. В этом случае единственной причиной может быть то, что 'photoJobs (« temp »)' Nothing. Отладчик легко поможет вам найти его. SideNote: 'MainForm' выглядит как ссылка на форму по умолчанию, укусит вас рано или поздно со многими приложениями. – Plutonix

+0

Почти все исключения NullReference имеют один и тот же набор причин. Для получения справки см. [Исключение NullReference в Visual Basic] (http://stackoverflow.com/a/26761773/1070452). – Plutonix

ответ

0

Ну это неудобно ...

Раствор, было просто, что я отсутствовал new, когда я объявил список, который он использовал для чтения Public Property imageList as list(of string), не могу поверить, что я это сделал ... Привет, спасибо за помощь всем.

1

Убедитесь, что imageList не является нулевым, так как вы объявляете новый PhotoJob, но не устанавливаете в нем никаких значений.

Когда вы имеете дело с NullReferenceException, вы не смотрите на что-то, отсутствующее в коллекции, это означает, что вы пытались получить доступ к объекту объекта null. Иногда это может быть побочным эффектом элемента не в коллекции, если коллекция возвращается null, но если значение не существует в Dictionary, вы получите KeyNotFoundException

1

Пожалуйста, убедитесь, что «ImageList» имеет «подсчет 'больше чем 0. Значит, просто проверьте, что в списке есть элементы в нем, выполняя строки тезисов перед выполнением цикла.

Dim фото As String() = CType (e.Data.GetData (DataFormats.FileDrop), String())

If MainForm.photoJobs("temp").imageList.Count > 0 Then 

    For i = 0 To MainForm.photoJobs("temp").imageList.Count - 1 
      If Not MainForm.photoJobs("temp").imageList.Contains(pics(i)) Then 
       MainForm.photoJobs("temp").imageList.Add(pics(i)) 
      End If 
     Next 
    'Gets the data from the file drop 
    Else 
     MainForm.photoJobs("temp").imageList = pics.ToList     
    End If 
Смежные вопросы