在尝试使用HashMap中的给定键获取值时,我们观察到了NullPointerException.
以下是我将用于说明问题的示例代码.
public class Test {
private Map<String, Integer> employeeNameToAgeMap = new HashMap<String, Integer>();
public int getAge(String employeeName) {
if (!employeeNameToAgeMap.containsKey(employeeName)) {
int age = getAgeFromSomeCustomAPI(employeeName);
employeeNameToAgeMap.put(employeeName, age);
}
return employeeNameToAgeMap.get(employeeName);
}
}
Run Code Online (Sandbox Code Playgroud)
在方法的最后一行获取NullPointerException,即"return employeeNameToAgeMap.get(employeeName);"
正如我们所看到的,employeeNameToAgeMap不是null,并且调用者也没有将employeeName作为null传递(这是我们已经接受了调用代码本身).
这个方法将从不同的线程以非常快的速度调用(来自一些计划运行的计时器任务,每100ms左右)
这个NullPointerException的原因似乎是为给定员工提供的值(年龄)为空,但事实并非如此,因为保证自定义API方法(getAgeFromSomeCustomAPI())返回给定员工的某个年龄,即使它返回null,那么异常stacktrace应该显示日志中的对应行而不是最后一行.
我唯一的假设是,当一个线程T1试图填充该缓存时,T2出现了,由于某种原因,它能够发现缓存已经拥有了employeeName,但是当它试图获得年龄时,它就抛出了一个NPE.但是我并不是100%确信当put()操作正在进行给定的键和值时,相同键的containsKey()返回true.
我知道需要增强此代码以满足同步问题(通过使用ConcurrentHashMap或锁),但期待知道此问题的真正原因.
我真的很感激帮助.
可以说我已经创建了一个键空间和表:
CREATE KEYSPACE IF NOT EXISTS keyspace_rep_0
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 0};
CREATE TABLE IF NOT EXISTS some_table (
some_key ascii,
some_data ascii,
PRIMARY KEY (some_key)
);
Run Code Online (Sandbox Code Playgroud)
我不想要这些数据的任何副本.我可以使用一致性级别插入此表ANY
.但是我无法从该表中选择任何数据.
与一致性水平查询时,我得到了下面的错误ANY
,并ONE
分别为:
message="ANY ConsistencyLevel is only supported for writes"
message="Cannot achieve consistency level ONE"
info={'required_replicas': 1, 'alive_replicas': 0, 'consistency': 1}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了其他读取一致性级别,但它们都没有为我工作.
这与选择'replication_factor': 1
和关闭节点非常相似.我再次无法选择任何数据.所有读取一致性级别至少需要一个副本才能启动.这是卡桑德拉的作品吗?没有复制,您无法选择数据?我错过了什么?