2016-05-24 3 views
0

私の問題は次のとおりです。 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ポインタを投げています。

+0

あなた自身のキャッシングをローリングするのではなく、カフェインをチェックアウトすることもできます。https://github.com/ben-manes/caffeine –

+0

チップをありがとうございます。この場合は、使いやすい。また、大量のデータをキャッシュすることはありません。したがって、その必要はありません。 – Artrax

答えて

0

問題はhasNext()です。 if(this.data == null)が真の場合、例外が発生しなければNullPointerが存在します。私はあなたがcache().get()の前にリターンステートメントを逃すかもしれないと思う。

+0

しかし、キャッシュは「データ」フィールドを開始しています。データがすでにキャッシュされているかどうかをチェックし、キャッシュされていない場合はデータをキャッシュします。 – Artrax

0

OK、エラーが見つかりました。 Guavaテーブルは、nullを値として受け入れず、nullpointer例外をスローしています。単純なif節でそれを修正し、検索されたオブジェクトがnullの場合は新しいObject()をマップに配置するだけです。

関連する問題