在使用guava时的纠结问题

本文探讨了使用Guava List进行转换操作时遇到的异常处理问题。由于Guava List的懒加载特性,在转换过程中发生的异常并未立即抛出,而是被延迟到后续的JSON序列化过程中。这导致了异常被“吞噬”的现象,给调试带来了困扰。

今天在做单元测试时,发现一个很奇怪的问题。

 

代码如下

 

 

    private List<String> buildTransAreaInfoList(List<CpmtransXAreaDO> areas){
        return Lists.transform(areas,new Function<CpmtransXAreaDO, String>() {
            @Override
            public String apply(CpmtransXAreaDO cpmtransXAreaDO) {
                return areasBO.getAreaById(cpmtransXAreaDO.getAreaid().toString());
            }
        });
    }

 

 

其中 

areasBO.getAreaById(cpmtransXAreaDO.getAreaid().toString());

会因为远程服务调用不同会抛出异常,但是很奇怪的是,异常被代码吃掉了,程序发生异常后依然在继续执行,

反复跟踪找不到原因,guava的代码并没有将异常try catch掉。

 

 

后来同事提醒,guava的List是lazy的,才恍然大悟。查了下文档:

 

The function is applied lazily, invoked when needed.

 

原因是这样的,这段代码是有异常,但是当时没有执行,而是在后面的代码

 

 

objectMapper.writeValueAsString(xxx)

 

 

中被执行了,而这个 jackson 的json 转换方法 只throw IOException, JsonGenerationException, JsonMappingException 异常,所以服务的异常就被吃掉了。

 

引以为鉴,今后在使用guava的List时要注意了

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值