You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:11:05