You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Carsten Ziegeler (JIRA)" <ji...@apache.org> on 2015/03/09 13:26:39 UTC
[jira] [Closed] (SLING-4220) SlingException constructor must not
call initCause
[ https://issues.apache.org/jira/browse/SLING-4220?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Carsten Ziegeler closed SLING-4220.
-----------------------------------
> 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.9.0
>
>
> 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)