NullReference Exeption

Status
Niet open voor verdere reacties.

verhaba

Gebruiker
Lid geworden
8 feb 2008
Berichten
79
hallo
Ik heb een schoolopdracht en die luidt als volgt:

Creëer een klasse waarvan objecten een voorstelling zijn van een punt op een XY-assenstelsel. Een punt heeft als eigenschappen een X en Y positie.
Creëer ook een klasse waarvan objecten een voorstelling zijn van een lijn, met een start- en eindpunt. Van de lijn moet je de lengte kunnen opvragen.

De client code krijgen we cadeau en moeten dus passend Klasse model maken. Dit is de client:

Opgelet: Aan de client code mag niets veranderd worden...

Code:
 Module PuntEnLijnTest
    Sub Main()
        PuntTestFixture()
        LijnTextFixture()
        '
        Console.ReadLine()
    End Sub
    Sub PuntTestFixture()
        Dim punt1 As Punt = New Punt
        Console.WriteLine(punt1.X = 0)
        Console.WriteLine(punt1.Y = 0)
        '
        punt1.X = 1
        Console.WriteLine(punt1.X = 1)
        Console.WriteLine(punt1.Y = 0)
        '
        punt1.Y = 3
        Console.WriteLine(punt1.X = 1)
        Console.WriteLine(punt1.Y = 3)
    End Sub
    Sub LijnTextFixture()
        Dim lijn1 As Lijn = New Lijn
        Console.WriteLine(lijn1.StartPunt Is Nothing)
        Console.WriteLine(lijn1.EindPunt Is Nothing)
        Console.WriteLine(lijn1.Lengte = 0)
        '
        Dim startPunt As Punt = New Punt With {.X = 1, .Y = 4}
        lijn1.StartPunt = startPunt
        Console.WriteLine(lijn1.StartPunt Is startPunt)
        Console.WriteLine(lijn1.EindPunt Is Nothing)
        Console.WriteLine(lijn1.Lengte = 0)
        '
        Dim eindPunt As Punt = New Punt With {.X = 5, .Y = 1}
        lijn1.EindPunt = eindPunt
        Console.WriteLine(lijn1.StartPunt Is startPunt)
        Console.WriteLine(lijn1.EindPunt Is eindPunt)
        Console.WriteLine(lijn1.Lengte = 5)
    End Sub
End Module

Dit is mijn code:

Code:
Class Punt
    Private m_X As Double = 0.0
    Public Property X() As Double
        Get
            X = m_X
        End Get
        Set(ByVal value As Double)
            m_X = value
        End Set
    End Property
    Private m_Y As Double = 0.0
    Public Property Y() As Double
        Get
            Y = m_Y
        End Get
        Set(ByVal value As Double)
            m_Y = value
        End Set
    End Property
End Class
Class Lijn
    Private m_StartPunt As Punt
    Public Property StartPunt() As Punt
        Get
            StartPunt = m_StartPunt
        End Get
        Set(ByVal value As Punt)
            m_StartPunt = value
            SetLengte()
        End Set
    End Property
    Private m_EindPunt As Punt
    Public Property EindPunt() As Punt
        Get
            EindPunt = m_EindPunt
        End Get
        Set(ByVal value As Punt)
            m_EindPunt = value
            SetLengte()
        End Set
    End Property
    Private m_Lengte As Double
    Public ReadOnly Property Lengte() As Double
        Get
            Lengte = m_Lengte
        End Get
    End Property
    Private Sub SetLengte()
        m_Lengte = System.Math.Sqrt((System.Math.Abs(MyClass.StartPunt.X) + System.Math.Abs(MyClass.EindPunt.Y)) + _
                                     (System.Math.Abs(MyClass.StartPunt.Y) + System.Math.Abs(MyClass.EindPunt.X)) _
                                     )
    End Sub
End Class

Spijtig krijg ik deze 'mooie' error. Ik weet waar het schoentje knelt... Maar zie niet de oplossing. Hij geeft een nulexeptionerror aangezien hij nog geen waarde heeft (null) voor het uitrekenen van de Lengte... hoe los ik dit nu op?!? iemand ideeën? Alvast bedankt.

Code:
System.NullReferenceException was unhandled
  Message="De objectverwijzing is niet op een exemplaar van een object ingesteld."
  Source="AfstandsOnderwijs3_1"
  StackTrace:
       bij ConsoleApplication1.Lijn.SetLengte() in C:\Users\Bart\Documents\Visual Studio 2008\Projects\AfstandsOnderwijs3\AfstandsOnderwijs3\Module1.vb:regel 49
       bij ConsoleApplication1.Lijn.set_StartPunt(Punt value) in C:\Users\Bart\Documents\Visual Studio 2008\Projects\AfstandsOnderwijs3\AfstandsOnderwijs3\Module1.vb:regel 29
       bij ConsoleApplication1.PuntEnLijnTest.LijnTextFixture() in C:\Users\Bart\Documents\Visual Studio 2008\Projects\AfstandsOnderwijs3\AfstandsOnderwijs3\Module1.vb:regel 82
       bij ConsoleApplication1.PuntEnLijnTest.Main() in C:\Users\Bart\Documents\Visual Studio 2008\Projects\AfstandsOnderwijs3\AfstandsOnderwijs3\Module1.vb:regel 57
       bij System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       bij System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bij Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bij System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bij System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bij System.Threading.ThreadHelper.ThreadStart()
  InnerException:
 
Het is al laat dus even snel een idee: waarom zou je eerst de lengte uitrekenen? Kun je toch beter gewoon 'on the fly' doen:
Code:
    Public ReadOnly Property Lengte() As Double
        Get
            Lengte = System.Math.Sqrt((System.Math.Abs(MyClass.StartPunt.X) + System.Math.Abs(MyClass.EindPunt.Y)) + _
                                     (System.Math.Abs(MyClass.StartPunt.Y) + System.Math.Abs(MyClass.EindPunt.X)) 
        End Get
    End Property
 
Woho... das snel... :thumb:
Ja idd, ook aan gedacht, maar is dit volgens de guidelines? Ik weet niet... Dit wordt dan uitgerekend, maar stel als het beter wordt gecashed? Dat zal allicht niet tot de opdracht horen, maar ik ben er wel naar benieuwd...
Thx.
 
Jammer maar helaas...
Is het resultaat hetzelfde.... Probleem zal blijkbaar ergens anders zitten.
 
had je die call naar setlengte er dan ook even uitgehaald?
 
Eigenlijk is het heel makkelijk.
Je roept SetLengte() 2x aan.

1: Na het zetten van de beginpunt.
2: Na het zetten van het eindpunt.

Je voelt hem al aankomen denk ik, 1 is natuurlijk niet nodig.
Je kunt geen lijn bereken als je 1 van de punten mist.

oplossing is natuurlijk om 1 aanroep weg te halen,
of te checken of 1 van de punten niet nothing is.
 
Hallo

Gevonden. Eerst moet ik controleren indien mijn waarden al geset zijn of niet. Indien niet Lengte = 0
else
voor ik de formule uit. Dit is de code:

Code:
    Public Function Lengte() As Integer
        If Startpunt Is Nothing OrElse Eindpunt Is Nothing Then
            Lengte = 0
        Else
            Lengte = Math.Abs(Math.Sqrt((EindPunt.X - StartPunt.X) ^ 2) - ((EindPunt.Y - StartPunt.Y) ^ 2))
        End If
    End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan