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
>> 
> 

Reply via email to