On 04/14/2013 07:36 PM, Joe Darcy wrote:
On 04/12/2013 07:29 PM, Jason Mehrens wrote:
Joe,
You'll have guard ise.addSuppressed against null.  Looks good otherwise.

private static void initCauseNull() {
      Throwable t1 = new Throwable();
      t1.initCause(null);
      try {
        t1.initCause(null);
      } catch(IllegalStateException expect) {
      }
}

Right you are; check added and test updated in:

    http://cr.openjdk.java.net/~darcy/8012044.2/

Full patch to Throwable:

[snip]

One more iteration; I've changed the initCause logic to suppress both exceptions rather than using one as the cause:

     http://cr.openjdk.java.net/~darcy/8012044.2

Patch to throwable:

--- old/src/share/classes/java/lang/Throwable.java 2013-04-14 19:33:23.000000000 -0700 +++ new/src/share/classes/java/lang/Throwable.java 2013-04-14 19:33:23.000000000 -0700
@@ -452,10 +452,15 @@
      * @since  1.4
      */
     public synchronized Throwable initCause(Throwable cause) {
-        if (this.cause != this)
-            throw new IllegalStateException("Can't overwrite cause");
+        if (this.cause != this) {
+            IllegalStateException ise =
+                new IllegalStateException("Can't overwrite cause", this);
+            if (cause != null)
+                ise.addSuppressed(cause);
+            throw ise;
+        }
         if (cause == this)
- throw new IllegalArgumentException("Self-causation not permitted"); + throw new IllegalArgumentException("Self-causation not permitted", this);
         this.cause = cause;
         return this;
     }
@@ -1039,7 +1044,7 @@
      */
     public final synchronized void addSuppressed(Throwable exception) {
         if (exception == this)
-            throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE);
+ throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, exception);

         if (exception == null)
             throw new NullPointerException(NULL_CAUSE_MESSAGE);

The suppression mechanism is typically, but not exclusively, used by the try-with-resources statement.

Thanks,

-Joe

Reply via email to