Java google guava正在检查缓存中的项目

Java google guava正在检查缓存中的项目,java,caching,guava,Java,Caching,Guava,我试图在一个程序中使用谷歌番石榴缓存,但不太明白它是如何工作的 我正在加载缓存,然后在稍后的阶段,我试图检查缓存中是否存在项,我下面的代码无法正常工作 如果getIfPresent不存在,则返回null,但调用它的加载会在出现错误后弹出 线程“main”com.google.common.cache.CacheLoader$InvalidCacheLoadException中的异常:CacheLoader为键返回null private static LoadingCache<Strin

我试图在一个程序中使用谷歌番石榴缓存,但不太明白它是如何工作的

我正在加载缓存,然后在稍后的阶段,我试图检查缓存中是否存在项,我下面的代码无法正常工作

如果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);

}
有人能解释一下我做错了什么吗?

美国的javadoc

参数

  • 应加载其值的非空键
返回

  • 与键关联的值不能为空
抛出

  • 异常-如果无法加载结果

您已经将其实现为返回
null
,这会破坏
CacheLoader
契约。

如果需要管理加载程序中的null值,请使用

@覆盖
公共可选加载(字符串键)引发异常{
返回可选的.fromNullable(getImage(key));
}
Image getImage(字符串键)引发ExecutionException{
//从数据库或其他源获取图像的代码
从源(键)返回您的代码到图像;
}
您的客户端代码可以是:

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
}
试试看{
可选imageCached=imageCache.get(文件名);
}捕获(执行异常e1){
//TODO错误处理
}
如果(imageCached.isPresent()){
Image img=imageCached.get();
}否则{
//img为null时的代码
}

首先,您不能从
load
方法中
返回null
。 如果要检查缓存中是否存在某个密钥,只需通过

Map imageMap=imageCache.asMap()


只需将该地图用作任何其他地图,即使用地图上的
containsKey
方法检查钥匙是否存在,等等

谢谢,那么我在这里用谷歌番石榴做什么是没有办法的?。。。我是新手,找不到那么多examples@blu10我真的不明白你想做什么。您的缓存加载程序正在尝试使用缓存加载某些内容。缓存加载程序应该为密钥提供缓存值。你似乎在倒行逆施。我想我不完全理解它是如何工作的。。。。我正在寻找一种快速的机制来缓存对象,并且能够检查它们是否存在于缓存中。。。检查它们是否存在是我没有得到的部分…@blu10不注册
CacheLoader
。只需使用
getIfPresent
。如果存在,它将返回值;如果不存在,它将返回值。
null
。缓存加载程序正在调用调用缓存的方法,该方法调用缓存加载程序。。。您的
load
方法实际上应该加载图像。
@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
}