我有一张地图,其中我将总字节数存储为键并计为值。如果密钥已存在于我的地图中,我需要将计数增加1。如果密钥不存在,则从1开始。
我有以下代码 -
Map<Integer, Integer> userList = new HashMap<Integer, Integer>();
for (String userId : listOfUsers) {
String sql = "select * from test_table where user_id='"+ userId + "';";
try {
SimpleStatement query = new SimpleStatement(sql);
ResultSet res = session.execute(query);
int totalBytes = 0;
Iterator<Row> rows = res.iterator();
while (rows.hasNext()) {
Row r = rows.next();
ByteBuffer client_value = r.getBytes("client_value");
int returned = client_value.remaining();
totalBytes = totalBytes + returned;
}
// does this look right?
userList.put(totalBytes, userList.get(totalBytes) + 1);
} catch (Exception e) {
// log an error
}
}
每当我第一次跑步时,我的userList.put
命令就会获得NPE。我在做什么问题?这段代码将在单线程中。
答案 0 :(得分:3)
不,如果密钥尚未出现,您将获得NullPointerException
。这是因为表达式userList.get(totalBytes) + 1
会尝试将null
取消装箱到int
。
正确的方法是在添加前进行null
检查。
Integer bytes = userList.get(totalBytes);
userList.put(totalBytes, bytes == null ? 1 : bytes + 1);
答案 1 :(得分:1)
没有
userList.put(totalBytes, userList.get(totalBytes) + 1);
第一次运行时,userList.get(totalBytes)
将返回一个空对象,当然不能递增。
可以修复为
Integer val = userList.get(totalBytes);
if (val == null) {
val = new Integer ();
}
val = val + 1;
答案 2 :(得分:0)
您可以更改
userList.put(totalBytes, userList.get(totalBytes) + 1);
到
userList.put(totalBytes, userList.getOrDefault(totalBytes, 0) + 1);
如果您正在使用Java 8,则无需进行手动空检查。
答案 3 :(得分:0)
请尝试以下方法..
userList.put(totalBytes,(userList.contains(totalBytes)?(userList.get(totalBytes)+1):1));