以下是我的問題: 我寫了一個方法來緩存一些sql-query結果和來自Iterator的hasnext()方法的實現。未來<Boolean>爲空?
public Future<Boolean> cache(){
return CSCore.dbManager.sqlprocessor.submit(() -> {
checker.writeLock().lock();
iterate.lock();
data = HashBasedTable.create();
try {
while (result.next()) {
for (int i = 1; i <= result.getMetaData().getColumnCount(); i++) {
data.put(result.getInt(1), result.getMetaData().getColumnName(i), result.getObject(i));
}
}
checker.writeLock().unlock();
iterate.unlock();
return true;
} catch (SQLException e) {
DatabaseManager.handlesqlexception(e);
CSCore.instance.getLogger().info(CSCore.infoDsp.get(data_fetch));
checker.writeLock().unlock();
iterate.unlock();
return false;
}
});
}
@Override
public boolean hasNext() {
if(this.data == null){
CSCore.instance.getLogger().info(CSCore.infoDsp.get(forced_caching));
try {
cache().get();
} catch (Exception e) {
CSCore.instance.getLogger().info(CSCore.infoDsp.get(row_get));
e.printStackTrace();
return false;
}
}
return current != this.data.rowKeySet().size() - 1;
}
所以當hasNext()被調用,即時得到調用chache()當一個NullPointerException得到() 以下是堆棧跟蹤:
java.util.concurrent.ExecutionException: java.lang.NullPointerException
[18:44:01 WARN]: at java.util.concurrent.FutureTask.report(FutureTask.java:122)
[18:44:01 WARN]: at java.util.concurrent.FutureTask.get(FutureTask.java:192)
[18:44:01 WARN]: at de.zortax.comsrv.core.data.RowSet.hasNext(RowSet.java:214)
[18:44:01 WARN]: at de.zortax.comsrv.core.user.UserProfile.lambda$loadFromDatabase$0(UserProfile.java:34)
[18:44:01 WARN]: at de.zortax.comsrv.core.concurrent.ThreadExecutor$2.runTask(ThreadExecutor.java:32)
[18:44:01 WARN]: at de.zortax.comsrv.core.concurrent.CSTask.run(CSTask.java:21)
[18:44:01 WARN]: at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:71)
[18:44:01 WARN]: at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350)
[18:44:01 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:729)
[18:44:01 WARN]: at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400)
[18:44:01 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660)
[18:44:01 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559)
[18:44:01 WARN]: at java.lang.Thread.run(Thread.java:745)
[18:44:01 WARN]: Caused by: java.lang.NullPointerException
[18:44:01 WARN]: at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:213)
[18:44:01 WARN]: at com.google.common.collect.StandardTable.put(StandardTable.java:140)
[18:44:01 WARN]: at com.google.common.collect.HashBasedTable.put(HashBasedTable.java:55)
[18:44:01 WARN]: at de.zortax.comsrv.core.data.RowSet.lambda$cache$3(RowSet.java:138)
[18:44:01 WARN]: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[18:44:01 WARN]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[18:44:01 WARN]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[18:44:01 WARN]: ... 1 more
既不是dbmanagerm也不sqlprocessor爲null ,他們應該在這些方法被調用之前啓動。 我在做什麼錯了?我的意思是,如果它不像Future-Object返回null,整個Method cache()將返回null或至少拋出一個空指針。
與其打開自己的緩存,您可能想要查看咖啡因:https://github.com/ben-manes/caffeine –
感謝您的提示,但在這種情況下,我們只需要一些非常小的使用方便。此外,我們不會緩存大量的數據,所以沒有必要:) – Artrax