IsNothing wirft Exception! Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    IsNothing wirft Exception! Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Hallo!

    ​Ich wollte eine Property auslesen, jedoch wirft das Programm logischerweise eine NullReferenceException(Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.) wenn das Objekt noch nicht erstellt worden ist.

    ​Wie kann ich einzelne Properties eines Objekts auf Verfügbarkeit prüfen?!?

    Mit Abfragen mittels "If IsNothing" etc. bekomme ich die selbe Fehlermeldung.

    Muss ich erst das Objekt prüfen und dann die Property?
    1. IsNothing ist banane. Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen
    2. IsNothing wirft keine NullReferenceException (wäre ja bescheuert). Was genau die Exception wirft, können wir Dir nur sagen, wenn Du uns den Code zeigst.
    Aber aus dem Text lese ich raus, dass Du sowas geschrieben hast: IsNothing(A.B)
    Wenn hier A Nothing ist, dann fliegt beim Auswerten von A.B die NullReferenceException.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Vielleicht fehlt mir gerade etwas Fantasie, aber wie liest Du eine Property ohne Objektinstanz aus?
    EDIT: Achso:

    VB.NET-Quellcode

    1. Dim foo As Bar = Nothing
    2. foo.prop = 1

    Dann bliebe wohl als erster Schritt:

    VB.NET-Quellcode

    1. If foo IsNot Nothing AndAlso foo.prop IsNot Nothing Then


    Oder mit einer selbstgemachten Objekt-Extension (z.B. IsNull):

    VB.NET-Quellcode

    1. If Not foo.IsNull AndAlso Not foo.prop.IsNull Then

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    VB.NET-Quellcode

    1. foo.prop = 1
    impliziert für prop den Typ Integer - Value-Type. Mit

    VaporiZed schrieb:

    VB.NET-Quellcode

    1. If foo IsNot Nothing AndAlso foo.prop IsNot Nothing Then
    fragste aber einen Referenz-Typ ab.
    Willste den armen @Morrison Nasweis führen? :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das benutze ich für so eine Aktion:
    ​habe ich irgendwann im Netz aufgeschnappt

    mit

    VB.NET-Quellcode

    1. If foo?.prop = .... then


    frägt man indirekt ab, ob foo nothing ist und wenn ungleich wird erst die Eigenschaft ausgewertet. So spart man sich die Schreibarbeit mit andalso.

    Finde leider gerade nur den Referenzlink nicht. Gerne auch Aufklärung ob das gut ist oder was dagegen spricht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SKeks“ ()

    Das nennt sich Nullable, ist aber nur bei Structures und anderen Value-Types machbar, nicht bei Klassen. Liegt daran, dass Value-Types von Haus aus im Gegensatz zu Klassen(instanzen) nicht nichts (Null/Nothing) sein können. Mit den Nullables hat man jene Value-Types um diese Möglichkeit erweitert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nee, kein Zufall. Fehlerhaftes Wissen meinerseits. Du hast recht. Folgendes klappt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim foo As bar = Nothing
    4. If foo?.Prop = 0 Then Stop
    5. End Sub
    6. End Class
    7. Public Class bar
    8. Public Property Prop As Integer = 0
    9. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    naja, kannst du ja bei der Verkettung mit andAlso im If Statement ja auch nicht. Ich nutze es nur für eine verkürzte Schreibweise und wenn ich dann verhindern will, dass eben die NullReference-Exception fliegt.

    Hatte ich häufiger das Problem beim festlegen von Aktionen mit der Maus (Klicks, Move, usw) auf Zeichenoberflächen, da dort ja bei jeder Aktion mit der Maus die entsprechenden Events gefeuert werden, aber nicht unbedingt Zeichenobjekte selektiert sind um die Aktion auszuführen.

    ErfinderDesRades schrieb:

    Könntest du voraussagen, was dieses ergibt?

    SKeks schrieb:

    naja, kannst du ja bei der Verkettung mit andAlso im If Statement ja auch nicht.
    Na aber hallo. Mit If ist es doch eindeutig: Der Teil vor AndAlso wird ausgewertet. Nur wenn er zutrifft, wird der Teil nach AndAlso auch ausgewertet. Bei EdRs ?-Beispiel könnte ich es nicht. Aber mein Wissensstand ist ja auch kein Maß.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, die Reihenfolge der Prüfung hast du hier auch: foo? wird zuerst geprüft und dann erst foo.prop. In den If-Block springst trotzdem nur wenn beides zutrifft und dann weißt du dass foo nicht nothing ist und das zweite Statement auch erfüllt.
    So hab ich auch die Frage von EDR verstanden. Man weiß nicht warum es stoppt, nur dass irgendwas nicht erfüllt ist. Wenn aber das Ergebniss egal ist und man nur verhindern möchte dass die Auswertung der Eigenschaft erfolgt, wenn foo nothing ist, denke ich dass man damit sich das Leben und den Code leichter macht. Siehe mein Beispiel mit den Events.

    ​Edit: habs mit dem Stichwort von EDR gefunden:
    docs.microsoft.com/de-de/dotne…ull-conditional-operators

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „SKeks“ ()

    VaporiZed schrieb:

    Das nennt sich Nullable, ist aber nur bei Structures und anderen Value-Types machbar, nicht bei Klassen.

    Vorsicht!
    Ein Fragezeichen nach einem Typ ist Nullable. Also zum Beispiel Integer? ist Nullable(Of Integer).
    Aber ein Fragezeichen nach einem Ausdruck ist dieser neue "Null-Conditional-Operator". Der sorgt dafür, dass in folgendem Fall:

    VB.NET-Quellcode

    1. Dim A As Object = Nothing
    2. Dim B As String = A?.ToString()

    bei .ToString keine NullReferenceException ausgelöst wird, obwohl A Nothing ist. Was B dann zugewiesen wird (Ich vermute mal Nothing), bzw. wie der Operator genau funktioniert weiß ich jetzt auch nicht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Jap B ist dann nothing oder null. Deshalb darf es auch nicht vom Typ string sein, sondern muss eben nullable sein. Will man das vermeiden einfach den doppel Fragezeichen operator ?? dahinter hängen und angeben was B eben sein soll, wenn der Ausdruck davor null ist.

    Gruß

    Zakath schrieb:

    Deshalb darf es auch nicht vom Typ string sein

    Doch, Strings sind Referenztypen, können also Nothing sein.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils