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)

Reply via email to