千家信息网

Java中GuavaCache返回Null的注意事项有哪些

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,本篇内容介绍了"Java中GuavaCache返回Null的注意事项有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细
千家信息网最后更新 2024年11月17日Java中GuavaCache返回Null的注意事项有哪些

本篇内容介绍了"Java中GuavaCache返回Null的注意事项有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

I. 常见使用姿势

@Testpublic 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 一般是可确认不会有问题的场景,直接调用

改造之后,我们的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();    }});

"Java中GuavaCache返回Null的注意事项有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0