Felix Meschberger created SLING-4220:
----------------------------------------
Summary: SlingException constructor must not call initCause
Key: SLING-4220
URL: https://issues.apache.org/jira/browse/SLING-4220
Project: Sling
Issue Type: Bug
Components: API
Affects Versions: API 2.8.0
Reporter: Felix Meschberger
Assignee: Felix Meschberger
Fix For: API 2.8.2
The SlingException constructors taking Throwable arguments both call
{{Throwable.initCause(Throwable)}} after calling the actual super-constructor.
This dates back to Rev. 609649 (Jan. 7th, 2008!) where I added this to make
sure the Throwable class is initialized with the given cause. At that time
SlingException extended from ServletException which does not do proper Java 1.4
exception chaining but implements its own chaining.
Later with SLING-186 (Rev. 614480, Jan. 23rd, 2008) SlingException was modified
to extend from RuntimeException which would do proper chaining. But the call to
{{Throwable.initCause(Throwable)}} was not removed back then. So this method is
still called when a SlingException is instantiated with a Throwable.
The problem comes from the implementation of the Throwable though, which throws
{{IllegalStateException}} if {{initCause(Throwable)}} is called after the cause
has already been set.
Throwable sets the cause field to {{this}} to indicate the cause has not been
set yet. But {{getCause()}} returns {{null}} both for no cause having been set
or the cause being {{null}}.
If the SlingException is instantiated with a {{null}} cause, this sets the
{{Throwable.cause}} field to {{nul}} thus returning {{null}} on {{getCause()}}
thus causing the SlingException to call {{initCause}}. This in turn causes
{{initCause(Throwable)}} to throw {{IllegalStateException}} because the cause
has already been set.
Long story short: SlingException must not call {{initCause}} because that is
not needed anymore since SLING-186/Rev. 614480
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)