1. ホーム
  2. java

[解決済み] java.util.concurrent.ExecutionException: java.lang.NullPointerException Error

2022-02-10 10:57:29

質問

以下のコードは、スタンドアロンで実行してもエラーになりません。これをWebサーバーにデプロイすると(サーバーのインターフェースを実装し、JARとしてクラスパスに追加)、次のようになります。

 java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.nbis.process.JSON_2_File_Split_V004.fn_1_parserEntity(JSON_2_File_Split_V004.java:256)
at com.nbis.process.JSON_2_File_Split_V004.fn_0_primaryCaller(JSON_2_File_Split_V004.java:177)
at com.nbis.process.JSON_2_File_Split_V004.execute(JSON_2_File_Split_V004.java:151)

コードスニペットです。

this.callable = new JSON_3_File_Process_V005(this.originalFileName, this.inProgressDirLoc, this.processedDirLoc, "[" + jSONRecord.toString() + "]", this.dataMDHolder, this.dataAccIDValueMap, this.dataCountryNameValueMap);
String[] fullContent = null;    
try {
    fullContent = executor.submit(this.callable).get();
} catch (ExecutionException e) {
    StringWriter errors = new StringWriter();
    e.printStackTrace(new PrintWriter(errors));
    log.info("Srii: " + errors.toString());
    executor.shutdown();
    return 7;
    } 

getの戻り値をExecutorCompletionServiceに追加するのも一つの手ですが、それでは非同期処理の概念がなくなってしまうのでは?つまり、呼び出し可能なgetからの出力文字列をStringBuilderに集めて、get回数が特定の数になったらディスクに格納する。データがディスクに出力されたら、StringBuilderをリフレッシュする。こうすることで、メモリにデータを保持することなく、一定時間ごとにディスクにデータをプッシュすることができる。

何が間違っているのか、何かご指摘はありますか?どのような入力も感謝します。ありがとうございます。

解決方法は?

修正しました。お役に立てれば幸いです。

問題は、変数の宣言の仕方にありました。クラスレベルの変数をstaticと宣言しなければならなかったので、この変数に適用された変更は他のすべてに反映されるようになりました。不思議なことに、スタンドアロンで実行した場合は問題が見当たりませんでした。

EDIT on 13112019: Moving my comment to the answer section, on request:

かなり前のことなので、変数の詳細を正確に覚えていません。this.originalFileName, this.inProgressDirLoc, this.processedDirLoc , this.dataMDHolder, this.dataAccIDValueMap, this.dataCountryNameValueMap のいずれかだと思いますが、どのメンバーから代入(または変更)しても、クラス内でその変数を参照したときに値が反映しないので静的に設定しなければならなかったのです。