Entwickler-Ecke
C# - Die Sprache - NullReferenceException verhindern. Gibt es ein assigned?!?
darkdust - Mo 14.12.09 13:08
Titel: NullReferenceException verhindern. Gibt es ein assigned?!?
Hallo Leute,
als eingefleischter Delphi-Programmierer versuche ich mir in den letzten Wochen C# anzueignen (viele Gründe wie Ihr euch vielleicht denken könnt).
Im Moment arbeite ich an einem Programm das Einträge aus meiner Datenbank mit Hilfe der Google API auf meinen Google-Kalender übertragen soll. Das funktioniert so weit auch wunderbar, nur gibt es da eine Sache die mir noch Kopfzerbrechen bereitet:
Ich benutze folgenden Code um meine Einträge abzugleichen:
----------------
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| private void writeEntryList(ArrayList inALDataToWrite) { CalendarService service = new CalendarService("CalendarApp"); service.setUserCredentials(fSUsername, fSPassword); foreach (EventEntry entry in inALDataToWrite) { Boolean lBIsInserted = false; foreach (EventEntry item in fALEntryListUnattended) { if (!lBIsInserted) { try { if (item.EventId == entry.EventId) { if (entry.Updated > item.Updated) entry.Update(); } } catch (NullReferenceException) { AtomEntry insertedEntry = service.Insert(postUri, entry); lBIsInserted = true; } } }
} } |
--------------------
Die inALDataToWrite enthält alle schon vorhandenen Datensätze und auch die Neuen. Bei allen neuen Datensätzen habe ich keinen Zugriff auf die EventId und löse damit eine NullReferenceException aus, die ich mit catch abfange.
Moderiert von
Christian S.: Quote- durch C#-Tags ersetzt
darkdust - Mo 14.12.09 13:13
Sorry, hab was abgeschnitten und ich kann nicht editieren (blöde Firewall):
Das ist natürlich ziemlich unsauber programmiert. In Delphi würde ich den Wert einfach mit assiged abfragen. Ich habe schon verschiedenste Befehle und NULL Kombinationen ausprobiert, aber es läuft immer auf die gleiche Exception...
Gibt es einen Befehl mit dem ich testen kann ob "entry.EventId" ein Wert zugewiesen ist?
Ich hoffe da kann mir Jemand von euch helfen ^^
Ralf Jansen - Mo 14.12.09 13:27
if (entry.EventId != null) ...
Edit: Wenn in inALDataToWrite nur EventEntry's sind wieso benutzt du nicht einfach eine List<EventEntry> anstatt ArrayList.
JüTho - Mo 14.12.09 13:40
Ralfs Antwort ist zwar grundsätzlich korrekt, passt aber nicht immer (und ich befürchte, hier passt es nicht).
Wenn EventId eine Zahl ist, dann bekommt das entsprechende Member von entry bereits durch den Konstruktor den Wert 0, weil Strukturen immer mit 0 initialisiert werden. In einem solchen Fall musst du also gegen 0 prüfen.
Was heißt eigentlich: du hast keinen Zugriff auf die EventId? Wenn es eine Eigenschaft der Klasse ist, kannst du es doch immer lesen.
Übrigens: Code ist als solcher zu markieren, nicht als Zitat. Dazu kannst du unter "Bereiche" C# auswählen und den Plus-Button verwenden. Außerdem gehört ArrayList in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.
Gruß Jürgen
darkdust - Mo 14.12.09 13:57
JüTho hat folgendes geschrieben : |
| und ich befürchte, hier passt es nicht |
Da hast du leider Recht:
Die ID ist übrigens ein String.
JüTho - Mo 14.12.09 14:01
darkdust hat folgendes geschrieben : |
| Die ID ist übrigens ein String. |
Das ist die wichtigste Information überhaupt! Dafür gibt es die schöne einfache Prüfung:
C#-Quelltext
1:
| if ( ! String.IsNullOrEmpty( entry.EventId ) ) { ... } |
Jürgen
Ralf Jansen - Mo 14.12.09 14:16
Du solltest überprüfen ob entry selbst nicht null ist.
Die Stelle die du zeigst sollte nicht knallen wenn der string in EventID null ist außer im getter von EventID passieren interne Dinge die schief gehen.
Das solltest du aber am Stack erkennen können bzw. am Source Code der API.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!