2010-06-02 3 views
0

Ceci est lié à my previous question mais c'est un problème différent.Null référence mais ce n'est pas?

J'ai deux classes: Serveur et base de données.

Public Class Server 

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 


Private _databases As List(Of Database) 
Public Property Databases() As List(Of Database) 
    Get 
     Return _databases 
    End Get 
    Set(ByVal value As List(Of Database)) 
     _databases = value 
    End Set 
End Property 


Public Sub LoadTables() 
    Dim db As New Database(Me) 
    db.Name = "test" 

    Databases.Add(db) 

End Sub 
End Class 

Public Class Database 
Private _server As Server 

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 


Public Property Server() As Server 
    Get 
     Return _server 
    End Get 
    Set(ByVal value As Server) 
     _server = value 
    End Set 
End Property 


Public Sub New(ByVal ser As Server) 
    Server = ser 
End Sub 
End Class 

assez simple. Je l'utilise comme ceci:

Dim s As New Server 
    s.Name = "Test" 
    s.LoadTables() 

Le problème est dans les LoadTables dans la classe Server. Quand il frappe Databases.Add (db) il me donne une erreur NullReference (Référence d'objet non définie). Je ne comprends pas comment ça se passe, tous les objets sont fixés. Des idées? Merci.

+0

Merci à tous! Je l'ai complètement raté. –

Répondre

4

Databases est null.

Modifier à

Private _databases As New List(Of Database) 
+1

+1 pour le code d'exemple –

4

Vous n'avez pas créé la liste à laquelle vous tentez d'ajouter l'objet. Vous avez seulement créé la propriété et c'est la propriété de soutien. Vous devez instancier la liste et l'assigner, généralement dans le constructeur, ou dans le cadre de la déclaration.

Public Sub New() 
    Databases = New List(Of Database) 
End Sub 
2

Je ne vois pas où les _databases domaine privé est lancé, tel qu'il est, il est un pointeur NULL.

2

Jetez un oeil de près le code de la propriété Databases

Private _databases As List(Of Database) 
Public Property Databases() As List(Of Database) 
    Get 
     Return _databases 
    End Get 
    Set(ByVal value As List(Of Database)) 
     _databases = value 
    End Set 
End Property 

Le getter ici retourne simplement le champ _databases. Ce champ est défini mais jamais initialisé, c'est donc Null/Nothing. Essayez de changer le champ à

Private _databases As New List(Of Database) 
Questions connexes