未来<boolean>为空?

时间:2016-05-24 16:52:25

标签: java nullpointerexception future

以下是我的问题: 我写了一个方法来缓存一些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或者至少抛出一个空指针。

2 个答案:

答案 0 :(得分:0)

嗯,问题出在hasNext()。如果if(this.data == null)为真,则会出现NullPointer,如果没有异常。我想你可能会错过cache().get()之前的退货声明。

答案 1 :(得分:0)

好的,发现了错误。 Guava Table不接受null作为值并抛出nullpointer异常。只需使用简单的if子句修复它,当检索到的对象为空时,将新的Object()放入映射中。