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

使用Optional的orElseThrow()遇未处理异常:解析失败抛自定义异常报错

问题原因与解决方案

核心问题

SimpleDateFormat.parse() 抛出的 ParseException 是检查型异常,而 Optional.map() 接收的 Function 函数式接口不允许抛出检查型异常——Function的apply方法声明里没有抛出检查型异常的语句,所以直接用方法引用simpleDateFormatYearMonth::parse会导致编译器报错,因为未处理检查型异常。

修复代码

你需要手动捕获ParseException,并将其转换为自定义的运行时异常(确保InvalidCustomException继承自RuntimeException,否则还是需要显式声明抛出):

public void validateConstraints(RequestType body) {
    
    SimpleDateFormat simpleDateFormatYearMonth = new SimpleDateFormat("yyyy-MM-dd");
    
    Date date = Optional
        .ofNullable(body.date())
        .map(dateStr -> {
            try {
                return simpleDateFormatYearMonth.parse(dateStr);
            } catch (ParseException e) {
                // 传入原异常作为cause,方便后续排查问题
                throw new InvalidCustomException("日期格式不符合要求: " + dateStr, e);
            }
        })
        .orElseThrow(() -> new InvalidCustomException("日期不能为空"));
}

额外建议

  • SimpleDateFormat不是线程安全的,如果这个方法会被多线程调用,建议改用Java 8+的DateTimeFormatter(线程安全)配合LocalDate:
public void validateConstraints(RequestType body) {
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    
    LocalDate date = Optional
        .ofNullable(body.date())
        .map(dateStr -> {
            try {
                return LocalDate.parse(dateStr, dateFormatter);
            } catch (DateTimeParseException e) {
                throw new InvalidCustomException("日期格式不符合要求: " + dateStr, e);
            }
        })
        .orElseThrow(() -> new InvalidCustomException("日期不能为空"));
}

DateTimeParseException本身就是运行时异常,不过如果你还是想抛自定义异常,依然可以按上面的方式捕获转换。

内容的提问来源于stack exchange,提问作者Vlad A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:44