Brian Goetz <[email protected]> writes: > try { clone() } > catch (RuntimeException e) { ... } > catch (CloneNotSupportedException e1) { .... }
I guess that means the change is not binary compatible either, since before the change the second catch block would run but after it the first one would. Éamonn 2012/10/14 Brian Goetz <[email protected]> > I believe this change is not source compatible. If a user says: > > try { clone() } > catch (RuntimeException e) { ... } > catch (CloneNotSupportedException e1) { .... } > > this compiles today but would fail to compile under this change. > > On Oct 14, 2012, at 7:06 PM, Mike Duigou wrote: > > > Seems reasonable to me at first glance. I am still reviewing this but > wanted to add two clarify notes: > > > > - This change means that CloneNotSupportedException is no longer a > checked exception. This change is generally harmless. > > > > - Cases where CloneNotSupportedException is being caught were probably > added because it was a checked exception. They can be safely left in. > > > > Mike > > > > > > On Oct 14 2012, at 09:19 , Remi Forax wrote: > > > >> 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 > >> > > > >
