我正在尝试在程序上使用google guava缓存,但我还没弄到它是如何工作的。
我正在加载缓存,然后在稍后阶段我试图检查缓存中是否存在某个项目,我的代码下面的代码不能正常工作
如果getIfPresent不存在,则返回null,但调用它的负载在出错后会弹出
线程“main”中的异常com.google.common.cache.CacheLoader $ InvalidCacheLoadException:CacheLoader为键返回null
private static LoadingCache<String, Image> imageCache
= CacheBuilder.newBuilder()
.build(new CacheLoader<String, Image>() {
@Override
public Image load(String key) throws Exception {
if (getImage(key) != null) {
return getImage(key);
}
return null;
}
});
public static Image getImage(String key) throws ExecutionException {
return imageCache.getIfPresent(key);
}
这意味着我无法检查缓存中项目的存在,如此
try {
readImage = imageCache.get(fileName);
} catch (ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (readImage != null) {
}
有人可以向我解释我在这里做错了吗?
答案 0 :(得分:4)
如果您需要在Loader中管理空值,请使用Guava Optional
@Override
public Optional<Image> load(String key) throws Exception {
return Optional.fromNullable(getImage(key));
}
Image getImage(String key) throws ExecutionException {
//your code to get image from database, or other source
return yourCodeToGetImageFromTheSource(key);
}
您的客户端代码可以是:
try {
Optional<Image> imageCached = imageCache.get(fileName);
} catch (ExecutionException e1) {
// TODO error handling
}
if (imageCached.isPresent()) {
Image img = imageCached.get();
} else {
//your code when img is null
}
答案 1 :(得分:2)
首先,您不能return null
方法load
。
如果您想检查缓存中是否存在某个密钥,只需在ConcurrentMap
中通过
LoadingCache
即可。
Map<K,V> imageMap = imageCache.asMap()
只需将该地图用作任何其他地图,即使用地图上的containsKey
方法检查是否存在密钥等等
答案 2 :(得分:1)
CacheLoader#load(String)
州的javadoc
<强>参数强>:
- key 应加载其值的非null键
<强>返回强>:
- 与密钥相关的值; 不得为空
<强>抛出强>:
- 例外 - 如果无法加载结果
您已将其实施为返回null
,这违反了CacheLoader
合同。