2013-03-13 97 views
0

我正在研究一個VB中的應用程序,它給了我一些麻煩。從Java和C++來看,VB的類語法是獨特的。我有我的主要形式,我創建了一個名爲WebElement的課程。我將這個類導入了MainForm.vb並宣佈了一個WebElement的數組。當我嘗試設置或獲取「WebElement」數組的第一個元素的Name屬性時,它給我一個錯誤 - 「未將對象引用設置爲對象的實例?」這是什麼意思,我該如何解決?VB.net類 - 對象引用未設置爲對象的實例?

代碼
MainForm.vb

Imports MyProgram.WebElement 

Public Class MainForm 

    Private webpage(0 To 9) As WebElement 
    Private pageNum As Integer = 0 

    Private Sub openFile() Handles OpenToolStripMenuItem.Click 
     webpage(pageNum).setName("rawr") 
     MsgBox(webpage(pageNum).getName()) 
    End Sub 

End Class 

WebElement.vb

Public Class WebElement 

    Private Name As String 

    Public Function setName(ByRef n As String) 
     Name = n 
    End Function 

    Public Function getName() 
     Return Name 
    End Function 

End Class 

回答

1

此行

Private webpage(0 To 9) As WebElement 

聲明10個元素應該是類型W​​ebElement的陣列。
陣列中沒有元素存在。所以每個插槽都是Nothing(C#中爲空)。
調用空元素上的方法會給NullReferenceException異常

你應該調用方法前檢查您元素,如果是空,創建元素,並將其分配給所需的插槽

Private Sub openFile() Handles OpenToolStripMenuItem.Click 
    if webpage(pageNum) Is Nothing Then 
     webpage(pageNum) = new WebElement() 
    End If 
    webpage(pageNum).setName("rawr") 
    MsgBox(webpage(pageNum).getName()) 
End Sub 

作爲一個側面說明,你爲什麼不嘗試使用NET語法來實現類的屬性

Public Class WebElement 

    Private Name As String 
    Public Property Name() As String 
     Get 
      Return Name 
     End Get 
     Set(ByVal value As String) 
      Name = value 
     End Set 
    End Property 
End Class 

,然後在你的代碼中使用它

webpage(pageNum).Name = "rawr" 
MessageBox.Show(webpage(pageNum).Name) 
+0

好吧,我想是有道理的。我認爲通過使用'setName()'函數我使它包含了某些東西,因此不能爲空或「nothing/null」。真奇怪。 – 2013-03-13 13:15:58

+0

首先要創建WebElement實例,然後將內存中的對象包含在內存中,並且可以針對實例調用方法和設置/獲取屬性。從@cody灰色看這個概念的精確描述 – Steve 2013-03-13 13:20:13

0

您已經創建webpage數組,但它的所有元素爲null,所以webpage(pageNum).setName("rawr")取消引用空對象

0

這意味着NullPointerException,因爲對象沒有被初始化,就像在java中一樣。

嘗試

Private webpage(0 To 9) As New WebElement

+0

我也這麼認爲。給我一個錯誤。 – 2013-03-13 13:10:56

2

你不WebElements填寫您的數組,你只告訴它它需要什麼尺寸。所以webpage(pageNum)是一個空對象。

嘗試

Private Sub openFile() Handles OpenToolStripMenuItem.Click 
    webpage(pageNum) = New WebElement() 
    webpage(pageNum).setName("rawr") 
    MsgBox(webpage(pageNum).getName()) 
End Sub 
+0

很酷,它的工作原理。所以,它之前沒有工作,因爲我實際上並沒有宣佈所有的對象?我只是在說,我需要該班的10個元素? – 2013-03-13 13:13:51

+0

@JoshI,很抱歉,我無法儘快回覆您。我希望你能得到你需要的答案。 – 2013-03-13 16:54:15

2

VB.NET中的類語法可能很特殊,但類的使用類與Java和C++非常相似。

尤其是有定義一個類(你寫了一首歌WebElement.vb並導入到你的MainForm.vb代碼文件)的之間的差異,以及對象類類型的。後者是你錯過的那個。

您需要在代碼中創建(實例化)類型爲WebElement的對象。你現在聲明的數組是空的(即它的所有元素都是空的)。你所做的全部是,宣稱爲吧。編譯器不會創建並用對象填充它,直到您要求它這樣做。

您需要初始化數組中的元素與一個新對象。您可以通過使用New關鍵字來完成此操作。語法如下所示:

webpage(0) = New WebElement() ' initializes the first element in the array 
           ' with a new WebElement object 

如果您願意,還可以在聲明它時初始化數組元素。爲了使這種神奇的發生,您忽略聲明左側的大小和右側使用初始化列表,像這樣:

Dim webpage() As WebElement = { 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement(), 
           New WebElement() 
           } 

但是這句法得到相當笨拙長數組,所以最人們更喜歡在聲明和創建對象之後立即循環數組的元素。

相關問題