Stream抛出的runtimeException可以被捕获么

一、背景

在进行String字符串转Data格式字段时,提示需要处理异常,

expenseVO.setBizDate(new SimpleDateFormat(DateUtil.COMMON_DATE_FORMAT).parse(ascpExpenseDO.getBizTime()));

大家都知道这个时候要么throws要么try-catch捕获住,我先是采用了throws打算在外面再统一处理,这时候提示编译报错;
在这里插入图片描述

2、问题解决过程

这个地方我明明try_catch处理这个异常了呀,为什么还报错提示unhandled exception呢?
经同事提醒是因为在stream里面抛出来的异常,只有runtimeException才可以被捕获到,我想那好,OK,在里面捕获,捕获到之后抛出一个继承运行时异常的自定义异常,然后加上自己的定义的业务编码就好了,然后谨慎起见我写了一下测试方法(事后证明我是多么的明智)
在这里插入图片描述
大家首先看下我写的这个测试方法,预期一下自己心中的结果;不瞒大家,我当时觉得会输出“抓住你了”,但是。。。T_T,打脸了:
在这里插入图片描述
没错,结果是程序正常运行,我当时就懵了,为什么?!!!
然后我就想把结果输出来一下,就把测试代码改成:
在这里插入图片描述
诶?这个时候怎么就抓住了呢?后面去查阅资料,因为Stream的操作分为中间操作和终结操作,而中间操作呢其实是一种“懒”操作,在进行foreach/collection之类的终结操作之前,map之类的中间操作其实是没有实际执行的:
在这里插入图片描述
这里就可以很明显的看出来了,只是进行map操作的时候,方法并没有实际执行,所以回过头,我的那个问题就迎刃而解了。
在这里插入图片描述

3、结论

Stream的操作分为中间操作和终结操作,而中间操作呢其实是一种“懒”操作,在进行foreach/collection之类的终结操作之前,map之类的中间操作其实是没有实际执行的。
所以捕获stream的中间操作(例如map,filter)方法里抛出来的异常需要添加终结操作(例如foreach,collect)让其实际执行,这样才能正常抛出异常并加以捕获。

参考:
https://www.cnblogs.com/heimianshusheng/p/5674372.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值