以下是我的问题: 我写了一个方法来缓存一些sql-query结果和一个来自Iterator的hasnext()方法的实现。
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.get() 以下是StackTrace:
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或者至少抛出一个空指针。
答案 0 :(得分:0)
嗯,问题出在hasNext()
。如果if(this.data == null)
为真,则会出现NullPointer,如果没有异常。我想你可能会错过cache().get()
之前的退货声明。
答案 1 :(得分:0)
好的,发现了错误。 Guava Table不接受null作为值并抛出nullpointer异常。只需使用简单的if子句修复它,当检索到的对象为空时,将新的Object()放入映射中。