使用ical4j创建日历时遇UnsupportedOperationException错误求助
iCal4j创建日历抛出UnsupportedOperationException问题排查
问题说明
使用ical4j 4.0.0-alpha12版本创建日历,按文档示例编写代码时,调用calendar.getProperties().add()操作抛出UnsupportedOperationException。
代码示例
package generate_icalendar; import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.model.property.CalScale; import net.fortuna.ical4j.model.property.ProdId; import net.fortuna.ical4j.model.property.Version; public class test { public static void main(String[] args) { Calendar calendar = new Calendar(); calendar.getProperties().add(new ProdId("-//Test//iCal4j 1.0//EN")); calendar.getProperties().add(Version.VERSION_2_0); calendar.getProperties().add(CalScale.GREGORIAN); } }
错误信息
run: Exception in thread "main" java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableCollection.add(Collections.java:1057) at generate_icalendar.test.main(test.java:19) C:\Users\anil\AppData\Local\NetBeans\Cache\12.5\executor-snippets\run.xml:111: The following error occurred while executing this line: C:\Users\anil\AppData\Local\NetBeans\Cache\12.5\executor-snippets\run.xml:94: Java returned: 1 BUILD FAILED (total time: 1 second)
环境信息
- JDK版本:JDK 1.8
- 项目依赖JAR包:
- commons-lang3-3.12.0.jar
- slf4j-api-2.0.0.jar
- commons-collections4-4.4.jar
- commons-codec-1.15.jar
- ical4j-4.0.0-alpha12.jar
问题原因及解决方案
原因
ical4j 4.x版本开始,new Calendar()默认创建的是不可变实例,调用getProperties()返回的是不可修改的集合(UnmodifiableCollection),因此调用add()方法会抛出UnsupportedOperationException——这是4.x版本引入的不可变设计,与旧版本(如1.x)的API行为不同。
解决方案
方案1:使用Calendar.Builder构建(推荐)
这是4.x版本官方推荐的构建方式,支持链式添加属性:
package generate_icalendar; import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.model.property.CalScale; import net.fortuna.ical4j.model.property.ProdId; import net.fortuna.ical4j.model.property.Version; public class test { public static void main(String[] args) { Calendar calendar = new Calendar.Builder() .withProdId(new ProdId("-//Test//iCal4j 1.0//EN")) .withVersion(Version.VERSION_2_0) .withCalScale(CalScale.GREGORIAN) .build(); } }
方案2:使用MutableCalendar(支持动态修改)
如果需要后续动态调整日历属性,可以使用可变日历实现:
package generate_icalendar; import net.fortuna.ical4j.model.MutableCalendar; import net.fortuna.ical4j.model.property.CalScale; import net.fortuna.ical4j.model.property.ProdId; import net.fortuna.ical4j.model.property.Version; public class test { public static void main(String[] args) { MutableCalendar calendar = new MutableCalendar(); calendar.getProperties().add(new ProdId("-//Test//iCal4j 1.0//EN")); calendar.getProperties().add(Version.VERSION_2_0); calendar.getProperties().add(CalScale.GREGORIAN); } }
内容的提问来源于stack exchange,提问作者AKPuvvada
相关产品推荐
相关产品推荐

