<Swing Dev> [10] RFR: 8182577: Crash when Tab key moves focus to a JCheckbox with a custom ButtonModel

Luke ldubox-coding101 at yahoo.co.uk
Wed Jun 28 15:29:33 UTC 2017


Hi Semyon,

On 28/06/2017 16:59, Semyon Sadetsky wrote:
>
>>
>> On one hand, it seems the best default methods are the ones able to 
>> produce correct behaviours w.r.t. the other interface methods when 
>> retrofitted, to avoid any 'surprises'. For example if some other code 
>> decides to switch from DefaultButtonModel to accept any ButtonModel - 
>> that would happily compile but it might be easy to miss the changed 
>> semantics: that calling getGroup may not necessarily give back a 
>> value passed in to setGroup any more, and hence there's scope for a 
>> subtle runtime crash bug to be introduced.
> Not sure that I fully understood this. According to the spec there is 
> the only group the button belongs to, and this group should be 
> returned in getGroup(). 

The spec can of course only apply to code written in Java 10+, legacy 
implementations ButtonModel will still return null.

So say a helper function in a shared library does an "instanceof 
DefaultButtonModel" check, and that it calls both setGroup(ButtonGroup) 
and getGroup() - and for whatever reason pulls the group back out rather 
than storing it in a local variable.

When porting that library to Java 10, a programmer might think "great, 
now I can support all ButtonModels" and drop the instanceof check.

Some other app not yet ported to Java 10 passes that utility method a 
custom ButtonModel, as it has always done. Instead of the utility 
function doing nothing with it, it now throws a NPE.

I just raised this because I know how ultra-concerned the JDK is with 
compatibility - but even by the JDK's high standards it does still seem 
like a fairly theoretical-only issue.

Is the @implSpec already sufficient warning to a programmer porting code 
to Java 10 to always deal with the null possibility? Perhaps it is.

Kind regards,
Luke




More information about the swing-dev mailing list