Warum ist die Ausnahme in ThreadPoolExecutors nachExecute () null?

8

Ich möchte Ausnahmen behandeln, die von Arbeitsthreads in ThreadPoolExecutor#afterExecute() method ausgelöst werden. Derzeit habe ich diesen Code:

%Vor%

Wenn ich den Code ausführe, bekomme ich:

%Vor%

Warum ist der Parameter Throwable t null in afterExecute() ? Sollte es nicht die SQLException Instanz sein?

    
Kaarel Purde 17.11.2015, 13:51
quelle

2 Antworten

7

Dies ist tatsächlich erwartetes Verhalten.

Zitieren afterExecute Javadoc:

  

Wenn Nicht-Null, ist Throwable die nicht erfasste RuntimeException oder Error, die die Ausführung abrupt beendet hat.

Dies bedeutet, dass die aufrufbare Instanz RuntimeException oder Error ist, nicht aktiviert Exception . Da SQLException eine geprüfte Ausnahme ist, wird sie nicht an afterExecute übergeben.

Es gibt auch noch etwas anderes hier (immer noch das Javadoc zitierend):

  

Hinweis: Wenn Aktionen explizit oder über Methoden wie "submit" in Aufgaben eingeschlossen sind (z. B. FutureTask ), erfassen und bearbeiten diese Aufgabenobjekte Berechnungsausnahmen und verursachen keine abrupten Beendigung, und die internen Ausnahmen werden nicht an diese Methode übergeben.

In Ihrem Beispiel ist die Aufgabe in einem FutureTask eingeschlossen, da Sie eine Callable übergeben, also in diesem Fall. Auch in dir änderst du deinen Code, um RuntimeException zu werfen, wenn nicht afterExecute angegeben wird. Das Javadoc gibt einen Beispielcode, um das zu bearbeiten, das ich hier als Referenz kopiere:

%Vor%
    
Tunaki 17.11.2015, 13:56
quelle
1

Dies ist eine alternative Methode. Ein Hinweis von hier

%Vor%

Die Verwendung von afterExecute dient einem anderen Zweck.

%Vor%

wiederum fehlschlagen und abrupt beenden.

    
Tyagi Akhilesh 17.11.2015 14:17
quelle