Код ниже выдает исключение NullPointerException только один раз.
public Optional<Object> getBucketObject(String key) {
return getKey(key, client::getBucket, RBucket::get);
}
public Optional<Long> getLong(String key) {
return getKey(key, client::getAtomicLong, RAtomicLong::get);
}
public Optional<Double> getDouble(String key) {
return getKey(key, client::getAtomicDouble, RAtomicDouble::get);
}
public <T, K extends RObject> Optional<T> getKey(String key, Function<String, K> getMethod, Function<K, T> returnMethod) {
K cachedObj = getMethod.apply(key);
return
cachedObj.isExists()
? Optional.of(returnMethod.apply(cachedObj)) (***line 50)
: Optional.empty();
}
Это трассировка стека:
java.util.Objects.requireNonNull (Objects.java:203)
java.util.Optional.<init> (Optional.java:96)
java.util.Optional.of (Optional.java:108)
xxx.xxx.getKey (xxx.java:50)
Мне было интересно, как это возможно. Единственная найденная мною возможность заключается в том, что между isExists () и apply () ключ был удален на сервере. Но это будет иметь смысл, только если метод isExists () проверит на сервере, а не проверит в ОЗУ.
Я попытался выполнить поиск в документации redisson, но ничего не сказано о том, проверяется ли он на сервере или оперативной памяти.
https://javadoc.io/doc/org.redisson/redisson/3.3.2/org/redisson/api/RObject.html#isExists -