0

私は私にいくつかの問題を与えているVBのアプリケーションに取り組んでいます。JavaとC++に由来するため、VBのクラス構文は独特です。メインフォームと、作成したクラスがありWebElementます。クラスをにインポートMainForm.vbし、の配列を宣言しましたWebElementName'WebElement`の配列の最初の要素の属性を設定または取得しようとすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていませんか?」というエラーが表示されます。これはどういう意味ですか、どうすれば修正できますか?

コード
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
4

5 に答える 5

2

配列をで埋めるのではなくWebElements、必要なサイズを指定するだけです。webpage(pageNum)nullオブジェクトもそうです。

試す

Private Sub openFile() Handles OpenToolStripMenuItem.Click
    webpage(pageNum) = New WebElement()
    webpage(pageNum).setName("rawr")
    MsgBox(webpage(pageNum).getName())
End Sub
于 2013-03-13T13:10:19.053 に答える
2

VB.NETのクラス構文は独特かもしれませんが、クラスの使用法はJavaやC++と非常に似ています。

特に、クラスタイプの定義(コードファイルに書き込んでインポートしたもの)と、そのクラスタイプのオブジェクトには違いがあります。後者はあなたが見逃しているものです。WebElement.vbMainForm.vb

WebElementコードでクラスタイプのオブジェクトを作成(インスタンス化)する必要があります。現在宣言している配列は空です(つまり、その要素はすべてnullです)。あなたがしたことはそれを宣言するだけです。コンパイラーは、ユーザーから要求されるまで、オブジェクトを作成してオブジェクトで埋めることはありません。

配列内の要素を新しいオブジェクトで初期化する必要があります。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()
                              }

ただし、この構文は長い配列ではかなり扱いにくいため、ほとんどの人は、宣言してオブジェクトを作成した直後に配列の要素をループすることを好みます。

于 2013-03-13T13:14:36.480 に答える
1

この行

 Private webpage(0 To 9) As WebElement

WebElement型である必要がある10個の要素の配列を宣言します。
配列に要素がありません。したがって、すべてのスロットはNothing(C#ではnull)です。
null要素でメソッドを呼び出すと、NullReferenceExceptionが発生します

メソッドを呼び出す前に要素を確認する必要があります。それがnullの場合は、要素を作成して必要なスロットに割り当てます。

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)
于 2013-03-13T13:10:40.130 に答える
0

配列を作成しましwebpageたが、その要素はすべてnullであるためwebpage(pageNum).setName("rawr")、nullオブジェクトを逆参照します

于 2013-03-13T13:07:18.903 に答える
0

これは、Javaの場合と同様に、オブジェクトが初期化されていないため、NullPointerExceptionを意味します。

試す

Private webpage(0 To 9) As New WebElement

于 2013-03-13T13:09:56.373 に答える