6

次のコード スニペットは、スタンドアロン モードで実行した場合、エラーをスローしません。これを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 を更新します。このようにして、データをメモリに保持することなく、一定の間隔でディスクにデータをプッシュします。

ここで何が間違っているかについての提案はありますか? 入力に感謝します。ありがとうございました。

4

2 に答える 2

5

これは修正されました。役立つ場合:

問題は、変数の宣言方法にありました。クラスレベルの変数を静的として宣言する必要があったため、この変数に適用された変更は他の場所に反映され始めました。奇妙なことに、スタンドアロンで実行したときの問題はわかりません。

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

かなり前のことなので、変数の詳細を正確に思い出せません。しかし、私はそれが次のいずれかであると信じています: this.originalFileName, this.inProgressDirLoc, this.processedDirLoc , this.dataMDHolder, this.dataAccIDValueMap, this.dataCountryNameValueMapクラス内の変数の参照中にメンバーが反映されていませんでした。

于 2013-10-08T08:39:34.847 に答える