浅谈Java中GuavaCache返回Null的注意事项

网友投稿 443 2022-11-26

浅谈Java中GuavaCache返回Null的注意事项

Guava在实际的java后端项目中应用的场景还是比较多的,比如限流,缓存,容器操作之类的,有挺多实用的工具类,这里记录一下,在使用GuavaCache,返回null的一个问题

I. 常见使用姿势

@Test

public void testGuava() {

LoadingCache cache = CacheBuilder.newBuilder().build(new CacheLoader() {

@Override

public String load(String key) throws Exception {

if ("hello".equals(key)) {

return "word";

}

return null;

}

});

String word = cache.getUnchecked("hello");

System.out.println(word);

System.out.println(cache.getUnchecked("word"));

}

上面是一个非常简单的测试case,需要注意的是,cache.get("word") 的执行,并不如逾期的返回的是null,而是会抛一个异常出来

word

com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key word.

 at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2287)

...

从异常描述能看出,不允许返回null,这一块之前倒是没怎么注意,因此对于null的情况,要么定义一个标记表示不存在,要么在load()方法中主动抛一个异常出来,在使用的时候注意下,通过异常的使用方式,可以如下

public class NoVlaInGauvaException extends Exception {

public NoVlaInGauvaException(String msg) {

super(msg);

}

@Override

public synchronized Throwable fillInStackTrace() {

return this;

}

}

说明:为什么重写fillInStackTrace方法

对于这种缓存未命中的情况下,一般而言是不需要关注完整的堆栈信息的,没有数据而已,可以节省一点点性能(当然除非是在高频率的抛出时,才会有表现症状)

其次就是get与getUnchecked的区别了

get要求显示处理exception状况

getUnchecked 一般是可确认不CDeEfXhd会有问题的场景,直接调用

改造之后,我们的cache如下

LoadingCache cache = CacheBuilder.newBuilder().build(new CacheLoader() {

@Override

public String load(String key) throws Exception {

if ("hello".equals(key)) {

return "word";

}

throw new NoVlaInGauvaException();

}

});

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于智能USBHost控制器IC在数据记录中的应用
下一篇:Giraph源码分析(七)—— 添加消息统计功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~