问题描述
今天在使用guava cache的时候,报了如下错误:
com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key 50816009. at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2346) at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2316) at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2278) at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2193) at com.google.common.cache.LocalCache.get(LocalCache.java:3932) at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3936) at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4806)
之前使用的时候一直都挺正常的,没有出现过此类异常,调用代码如下:
/** 本地缓存 */ private LoadingCache<Long, ServiceInfo> queryByCategoryIdCache = CacheBuilder.newBuilder().refreshAfterWrite(CacheConstants.SERVICE_INFO_CACHE_REFRESH_TIME, TimeUnit.SECONDS) .maximumSize(CacheConstants.MAX_SIZE_PER_CACHE).build(new CacheLoader<Long, ServiceInfo>() { public ServiceInfo load(Long categoryId) { return getServiceInfoByCategoryId(categoryId); } });
@Override public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache) { if (withCache) { try { return queryByCategoryIdCache.get(categoryId); } catch (Throwable t) { logger.error("query serviceInfo exception", t); return null; } } else { return getServiceInfoByCategoryId(categoryId); } }
原因分析
后来又仔细看了下报错信息,大概意思是结果的返回值为null,而guava缓存中又不会存放value为null的数据,导致抛出异常。如果业务流程中,允许存在结果为null的话,只需要捕获到该异常后,返回null就行,可以忽略产生的一次信息。示意代码如下:
@Override public ServiceInfo getServiceInfoByCategoryIdWithCache(long categoryId, boolean withCache) { if (withCache) { try { return queryByCategoryIdCache.get(categoryId); } catch (Throwable t) { return null; } } else { return getServiceInfoByCategoryId(categoryId); } }
相关推荐
com.google.common.annotations com.google.common.base com.google.common.collect com.google.common.io com.google.common.net com.google.common.primitives com.google.common.util.concurrent 源码...
此外,Guava的`com.google.common`包不仅仅局限于集合,还有`cache`模块用于缓存,`primitives`模块处理基本类型,`functional`模块提供函数式编程的支持,等等。这些工具共同构成了一个强大而全面的Java开发工具箱...
com.google.common.collect.Lists的jar包
在Java编程领域,`com.google.common.collect`是一个非常重要的包,它是Google的Guava库的一部分。Guava是一个广泛使用的开源库,提供了许多实用的集合框架、缓存、原生类型支持、并发工具、字符串处理等功能。`...
`com.google.common.base.Preconditions`是Google Common库中的一个关键类,它提供了多种静态方法,用于在程序执行前检查条件是否满足,以此来预防运行时异常。这些方法在编写健壮的代码时非常有用,因为它们可以在...
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] ...
com.google.common google jar包
其中,`com.google.common.base.Preconditions`是这个库中一个非常重要的模块,主要用于在代码中进行参数检查,确保程序的健壮性。 `Preconditions` 类提供了一系列静态方法,用于在执行方法或构造函数时验证输入...
Files contained in ...com.google.zxing.common.detector.MonochromeRectangleDetector.class com.google.zxing.common.detector.WhiteRectangleDetector.class com.google.zxing.common.reedsolomon.GF256.class ...
对于生成二维码,可以使用`com.google.zxing.common.BitMatrix`和`com.google.zxing.qrcode.QRCodeWriter`类,它们允许你指定二维码的内容、纠错级别和其他参数。 下面是一个简单的示例代码,展示了如何使用ZXing库...
然后,通过`com.google.zxing.common.BufferedImageLuminanceSource`类将图像转换为ZXing可以理解的格式。接下来,利用`com.google.zxing.MultiFormatReader`类进行解码,它可以识别多种条码格式。如果成功,`decode...
只需放入pulign中替换原来文件就行,然后就可以进行破解,打开软件就可以了
本jar包用于导入Google下所需的部分类和内置文件。本jar包用于导入Google下所需的部分类和内置文件
版本:20.26.13 (000300-319035724) 适用于安卓4.1-4.4范围的armv7a构架操作系统
`Common`通常包含了一些通用的辅助函数和类,比如字符串处理、日期时间操作、异常处理等,旨在提高代码复用性和减少重复编写基础代码的工作。而`DBUtility`很可能是数据库访问的封装,提供了对数据库操作的简便接口...
搞P2P需要的一些包====java的 com.borland.zip com.google.common.all.zip de.javawi.jstun-0.6.1.zip javax.media-com.sun.-net.sf.fmj.jar.zip 收集不易,共享上传给需要的朋友童鞋。。。。
在RocketMQ的过滤器中,`com.google.common.cache.*`的使用可能是为了实现消息过滤的缓存策略,避免频繁的计算过滤条件,提高消息处理速度。RocketMQ是阿里巴巴开源的消息中间件,Guava的集成可以有效地优化其过滤器...