私の問題は次のとおりです。 Iteratorからhasnext()メソッドのいくつかのsql-query結果と実装をキャッシュするメソッドを書きました。未来<Boolean>はnullですか?
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を取得 後はのStackTraceあるget()は:。
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を返すのと同じでない場合、メソッド全体のcache()はnullを返しているか、少なくともNULLポインタを投げています。
あなた自身のキャッシングをローリングするのではなく、カフェインをチェックアウトすることもできます。https://github.com/ben-manes/caffeine –
チップをありがとうございます。この場合は、使いやすい。また、大量のデータをキャッシュすることはありません。したがって、その必要はありません。 – Artrax