Java Ical4j - Zugriff auf nicht vorhandenes Property führt zu Absturz ohne Exception

furryhamster

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.101
Hi,

ich apache Camel erstellt bei mir aus einer Ical Datei ein ical4j calendar. Wenn ich jetzt auf ein Property von einem Event zugreife, welches in der Ical nicht gesetzt war, dann bricht das komplette Programm ohne Exception ab. Dabei ist ist egal ob ich auf das .getValue(), .validate oder .isCalendarProperty zugreife.

Hier mal ein Beispiel:
Code:
for (Object o : calendar.getComponents("VEVENT")) {
	Component c = (Component)o;
	customIcal = new customIcal();
	System.out.println(c.getProperty("UID").getValue());
	System.out.println(c.getProperty("LOCATION").getValue());
}

Die UID zeigt er noch an. Bei Location hört das Programm einfach auf (ohne Exception). Wie kann ich dies handeln? Es würde mir schon reichen wenn einfach ein "" setzen könnte.
 
Was liefert denn folgender Code?
Code:
c.getProperty("LOCATION")
 
Das liefert ein Property zurück. Zumindest funktioniert folgendes:
Code:
Property prop = c.getProperty("LOCATION");

Was mir aber aufgefallen ist: Die Ical die ich nutze beinhaltet gar kein LOCATION. Das ist zwar kein Pflichtattribut, allerdings liefert eine andere Ical von mir und die vom Google Kalender dann ein "leeres" Location. Damit dürfte das Problem nicht auftreten (bin gerade noch am testen) und somit wäre meine unsprüngliche Ical nicht valide. Fände es trotzdem merkwürdig wenn sich das Problem nicht handeln ließe.

Edit: Zu früh gefreut. auch wenn das Location Attribut vorhanden aber leer ist scheint dieses nicht bei der umwandlung gesetzt zu werden
 
Zuletzt bearbeitet:
furryhamster schrieb:
Die UID zeigt er noch an. Bei Location hört das Programm einfach auf (ohne Exception)

Wie sieht denn das gesamte Programm aus? Werden an irgendeiner Stelle Exceptions gefangen, aber nicht behandelt?
 
soares schrieb:
Wie sieht denn das gesamte Programm aus? Werden an irgendeiner Stelle Exceptions gefangen, aber nicht behandelt?

derzeit werden noch keine exceptions abgefangen --> kein einziger try catch block

code sieht derzeit wie folgt aus:
Code:
	public void process(Exchange exchange) {
		System.out.println("Prozessor geöffnet");
		//Ical Objekt erzeugen
		net.fortuna.ical4j.model.Calendar calendar = (Calendar) exchange.getIn().getBody();
		System.out.println(calendar.getComponents().toString());

		customIcal[] customIcalArray = new customIcal[calendar.getComponents().size()];
		customIcal customIcal;
		
		// For each VEVENT in the ICS
		for (Object o : calendar.getComponents("VEVENT")) {
			Component c = (Component)o;
			customIcal = new customIcal();
			customIcal.setUid(c.getProperty("UID").getValue());
			customIcal.setBetreff(c.getProperty("SUMMARY").getValue());
			
			System.out.println("noch bin ich nicht abgestürzt");

			PropertyList myList = c.getProperties();
			for (Object oo : myList) {
				Property myP = (Property)oo;
				System.out.println("property: " + myP.getName());
			}
			System.out.println(c.getProperty("LOCATION").getValue());
}}

Die ical wird mit apache camel abgeholt und in ein iCalendar Objekt "geunmarshelt"

Edit: Okay ist noch zu früh für mich... Ich hab trotz anpassung auf die Ical zugegriffen. Mit der "richtigen" Ical in der ein leeres LOCATION Property angeben ist funktioniert es auch... wenn noch wer für den fall das kein Location angeben ist eine Lösung weiß nur her damit
 
Zuletzt bearbeitet:
Ich habe es mal schnell nachgebaut und ich bekomme eine NPE, wenn LOCATION nicht vorhanden ist.
Bau eine Prüfung ein, ob getProperty() != null ist.
 
wahli schrieb:
Ich habe es mal schnell nachgebaut und ich bekomme eine NPE, wenn LOCATION nicht vorhanden ist.
Bau eine Prüfung ein, ob getProperty() != null ist.

Vielen Dank das du dir die Mühe gemacht hast es nachzubauen. Mit != null Prüfung geht es tatsächlich. Hatte dies nur ausgeschlossen da bei mir keine NPE kam... Liegt vlt an apache Camel. Da muss ich mal nachschauen warum ich keine NPEs bekomme aber ggf. andere Exceptions Danke nochmals!
 
Da stimmt aber grundsätzlich etwas nicht, wenn du keine Exceptions bekommst. An Apache Camel liegt es sicherlich nicht. Das Objekt "Component" c ist aus dem ical4j und nicht aus Apache Camel.
Ich vermute, dass du Apache Camel dafür benutzt, um die ical abzuholen. Danach geht es mit ical4j weiter.

Mach mal "ganz oben" ein try-catch.
 
hab jetzt den oben genannten code mit einem catch (Exception e) umgeben. der bricht trotzdem ab sobald das syso mit dem nicht vergebenen location kommt.
Ich werde jetzt wahrscheinlich noch ne validation bauen und fehlende properties hinzufügen für den fall der fälle aber beunruhigt doch etwas das ich vielleicht auch andere exceptions nicht angezeigt bekomme

Edit: heute ist nicht mein tag... exception wird jetzt durch den catch block abgefangen... schusselfehler... besser an solchen tagen im bett bleiben
 
Zuletzt bearbeitet:
Zurück
Oben