使用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
相关产品推荐
相关产品推荐

