2016-05-24 36 views
0

以下是我的問題: 我寫了一個方法來緩存一些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或至少拋出一個空指針。

+0

與其打開自己的緩存,您可能想要查看咖啡因:https://github.com/ben-manes/caffeine –

+0

感謝您的提示,但在這種情況下,我們只需要一些非常小的使用方便。此外,我們不會緩存大量的數據,所以沒有必要:) – Artrax

回答

0

那麼,問題出在hasNext()。如果if(this.data == null)爲真,則會有NullPointer,如果沒有異常發生。我想你可能會錯過cache().get()之前的退貨聲明。

+0

但緩存正在啓動「數據」字段。它只檢查數據是否已被緩存,如果沒有,則緩存數據。 – Artrax

0

好的,發現了錯誤。 Guava Table不接受null作爲值並拋出一個空指針異常。簡單地用一個簡單的if子句修復它,當檢索到的對象爲空時,將一個新的Object()放入地圖中。

相關問題