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

 更新时间:2021年10月31日 16:00  点击:1932 作者:一灰灰

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

I. 常见使用姿势

@Test
public void testGuava() {
    LoadingCache<String, String> cache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {
        @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<String, String> cache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {
    @Override
    public String load(String key) throws Exception {
        if ("hello".equals(key)) {
            return "word";
        }
        throw new NoVlaInGauvaException();
    }
});

到此这篇关于浅谈Java中GuavaCache返回Null的注意事项的文章就介绍到这了,更多相关GuavaCache返回Null内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://juejin.cn/post/7024826582405480478

[!--infotagslink--]

相关文章

  • mybatis-plus 返回部分字段的解决方式

    这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-02
  • 校验非空的注解@NotNull如何取得自定义的message

    这篇文章主要介绍了校验非空的注解@NotNull如何取得自定义的message,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-29
  • lua读取redis数据的null判断示例代码

    最近在工作中遇到了一个问题,通过查找相关资料才得知原因是因为返回结果的问题,下面这篇文章主要给大家介绍了关于lua读取redis数据的null判断的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2020-06-30
  • SQLMAP结合Meterpreter实现注入渗透返回shell

    sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25
  • mysql IS NULL使用索引案例讲解

    这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
  • nestjs返回给前端数据格式的封装实现

    这篇文章主要介绍了nestjs返回给前端数据格式的封装实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
  • php stream_get_meta_data返回值

    测试代码如下:复制代码 代码如下:<?php$fp=fopen("http://www.sina.com.cn", 'r');$stream_meta = stream_get_meta_data($fp);print_r($stream_meta);?>在我本机输出如下:Array( [wrapper_data] => Array...2013-10-04
  • Mybatis返回结果封装map过程解析

    这篇文章主要介绍了Mybatis返回结果封装map过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • 解决微信授权成功后点击按返回键出现空白页和报错的问题

    这篇文章主要介绍了解决微信授权成功后点击按返回键出现空白页和报错的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-08
  • Vue实现返回顶部按钮实例代码

    这篇文章主要给大家介绍了关于Vue实现返回顶部按钮的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-21
  • 解决SpringBoot返回结果如果为null或空值不显示处理问题

    这篇文章主要介绍了解决SpringBoot返回结果如果为null或空值不显示处理问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-28
  • C#6 null 条件运算符

    本文主要对比C# 6 null运算符与老版本的不同,并且用代码实例测试,发现新语法性能提高,语法简化了。希望看到的同学对你有所帮助...2020-06-25
  • 浅谈为什么Mysql数据库尽量避免NULL

    这篇文章主要介绍了浅谈为什么Mysql数据库尽量避免NULL,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-08
  • PHP通用返回值设置

    PHP是现在很多程序比较常用的软件,一些人在写php代码时候,会遇到需要返回值的情况。这里可以统一设置下返回值格式,下面文章就给大家介绍返回值设置实例,下面一起来看看。...2017-07-06
  • 解析Mybatis的insert方法返回数字-2147482646的解决

    这篇文章主要介绍了解析Mybatis的insert方法返回数字-2147482646的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-02
  • django数据模型中null和blank的区别说明

    这篇文章主要介绍了django数据模型中null和blank的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-03
  • C#检查foreach判读是否为null的方法

    这篇文章主要介绍了C#如何检查foreach判读其是否为null,文中给出了示例代码,介绍的很详细,需要的朋友可以参考下方法...2020-06-25
  • python 插入Null值数据到Postgresql的操作

    这篇文章主要介绍了python 插入Null值数据到Postgresql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-06
  • C#异步方法返回void与Task的区别详解

    这篇文章主要给大家介绍了关于C#异步方法返回void与Task的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-04
  • 总结IOS中nil、Nil、NULL和NSNull区别

    相信有不少朋友想知道,在 Objective-C 中 nil 和 Nil 以及 NULL 的区别。最重要的是,在面试中还有不少朋友常会被问到。现在小编在这里统一详细说明。...2020-04-25