ical4j
ical4j copied to clipboard
Clarification: NumberFormatException vs ParserException
Currently, parsing iCalendars with invalid values often throw a NumberFormatException. For instance:
BEGIN:VEVENT
DTSTAMP:20190112T110842Z
CREATED:20190112T110818Z
UID:[email protected]
SEQUENCE:2
LAST-MODIFIED:20190112T110842Z
DESCRIPTION:Ankunft: Sonntag\, 28. Juli 2019\, anreise zwischen 15:30 - 21:
00\n\nAbreise: Samstag\, 3. August 2019\, abreise zwischen 10:00 - 10:30\n
\nSie können Ihre Buchung hier ansehen\, ändern oder stornieren
SUMMARY:Some Hotel
LOCATION:Puchen 209\, Altaussee\, 8992\, Austria
GEO:47.634239\;13.767147
DTSTART;VALUE=DATE:20190728
DTEND;VALUE=DATE:20190804
TRANSP:OPAQUE
CLASS:PRIVATE
END:VEVENT
causes
java.lang.NumberFormatException: For input string: "47634239\"
at java.lang.Long.parseLong(Long.java:443)
at java.lang.Long.parseLong(Long.java:485)
at java.math.BigDecimal.<init>(BigDecimal.java:344)
at java.math.BigDecimal.<init>(BigDecimal.java:425)
at net.fortuna.ical4j.model.property.Geo.setValue(Geo.java:211)
at net.fortuna.ical4j.data.CalendarBuilder$ContentHandlerImpl.propertyValue(CalendarBuilder.java:299)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.parse(CalendarParserImpl.java:282)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.access$1100(CalendarParserImpl.java:229)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:210)
at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.parse(CalendarParserImpl.java:422)
at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.access$900(CalendarParserImpl.java:406)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:208)
at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendar(CalendarParserImpl.java:115)
at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendarList(CalendarParserImpl.java:180)
at net.fortuna.ical4j.data.CalendarParserImpl.parse(CalendarParserImpl.java:149)
at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:198)
at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:178)
at at.bitfire.ical4android.Event$Companion.fromReader(Event.kt:78)
BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:Wieseclan
PRODID:-//The Horde Project//Horde iCalendar Library//EN
BEGIN:VTODO
UID:1d58e8e0-4fac-4632-8d43-ec79757490d2.1519164997000
SUMMARY:Alex Geschenkeliste
DESCRIPTION:[ ] Tip Toi Rund um die Uhr\n[ ] Ravensburger Wort für Wort\n[
] Hula Hoop Reifen\n[ ] Pfeil und Bogen mit Zielscheibe\n[ ] Tip Toi
Spielwelt Autorennen
PRIORITY:
STATUS:NEEDS-ACTION
END:VTODO
END:VCALENDAR
causes
EXCEPTION java.lang.NumberFormatException: For input string: ""
at java.lang.Integer.parseInt(Integer.java:620)
at java.lang.Integer.parseInt(Integer.java:643)
at net.fortuna.ical4j.model.property.Priority.setValue(Priority.java:218)
at net.fortuna.ical4j.data.CalendarBuilder$ContentHandlerImpl.propertyValue(CalendarBuilder.java:299)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.parse(CalendarParserImpl.java:282)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyParser.access$1100(CalendarParserImpl.java:229)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:210)
at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.parse(CalendarParserImpl.java:422)
at net.fortuna.ical4j.data.CalendarParserImpl$ComponentParser.access$900(CalendarParserImpl.java:406)
at net.fortuna.ical4j.data.CalendarParserImpl$PropertyListParser.parse(CalendarParserImpl.java:208)
at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendar(CalendarParserImpl.java:115)
at net.fortuna.ical4j.data.CalendarParserImpl.parseCalendarList(CalendarParserImpl.java:180)
at net.fortuna.ical4j.data.CalendarParserImpl.parse(CalendarParserImpl.java:149)
at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:198)
at net.fortuna.ical4j.data.CalendarBuilder.build(CalendarBuilder.java:178)
at at.bitfire.ical4android.Task$Companion.fromReader(Task.kt:66)
I wonder whether this
- is intended behavior – in this case, it should be documented in
CalenderBuilder.buildJavaDoc that these methods@throws IllegalArgumentExceptionorNumberFormatException. I could send a merge request for that. or - should be wrapped in a
ParserException, but then this would apply to all operations that could throw anIllegalArgumentException
Perhaps we could use the role that any checked exceptions are wrapper in ParserException and unchecked exceptions (illegal argument, number format, etc) need to be handled in application code.
For this we probably need to document accurately the unchecked exceptions so they can be handled..
+1
Example:
GEO:12.345678\;-1.234587
->
Caused by: java.lang.NumberFormatException: For input string: "12345678\"
at java.lang.Long.parseLong(Long.java:594)
at java.lang.Long.parseLong(Long.java:636)
at java.math.BigDecimal.<init>(BigDecimal.java:344)
at java.math.BigDecimal.<init>(BigDecimal.java:425)
at net.fortuna.ical4j.model.property.Geo.setValue(Geo.java:214)
Maybe unescape string forgotten like here?
aValue.substring(0, aValue.indexOf(';'));
...