Hi everybody,
CloneNotSupportedException is thrown when a developer calls Object.clone() and forget to mark the current object as Cloneable. Because it's clearly a developer error, CloneNotSupportedException should be a subtype of RuntimeException and not of Exception.

I believe this change is backward compatible because RuntimeException is a subclass of Exception, so I propose to first change CloneNotSupportedException to extends RuntimeException.

diff -r ff641c5b329b src/share/classes/java/lang/CloneNotSupportedException.java --- a/src/share/classes/java/lang/CloneNotSupportedException.java Sat Oct 13 10:15:57 2012 +0100 +++ b/src/share/classes/java/lang/CloneNotSupportedException.java Sun Oct 14 18:16:35 2012 +0200
@@ -42,7 +42,7 @@
  */

 public
-class CloneNotSupportedException extends Exception {
+class CloneNotSupportedException extends RuntimeException {
     private static final long serialVersionUID = 5195511250079656443L;

     /**


And then to clean up the whole JDK (in several patches) to remove all the unnecessary
try/catch like the one in by example ArrayList.clone()

    public Object clone() {
        try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }

will become

    public Object clone() {
        ArrayList<?> v = (ArrayList<?>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    }


cheers,
Rémi

Reply via email to