一、背景
在进行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