<Swing Dev> Unexpected NullPointerException by endComposition()

Pavel Porvatov pavel.porvatov at oracle.com
Thu Oct 27 13:12:40 UTC 2011


Hi Charles,
> On 10/14/2011 04:06 PM, Pavel Porvatov wrote:
>> Hi Charles,
>>> On 10/11/2011 05:50 PM, Pavel Porvatov wrote:
>>>> Hi Charles,
>>>>> On 10/08/2011 05:41 PM, Pavel Porvatov wrote:
>>>>> I got your point. What about this solution:
>>>>> If in the compose mode, endCompositoin just sendComposedText 
>>>>> instead of sendCommittedText.
>>>>>
>>>>> The patch is attached
>>>>>
>>>> Could you please explain the fix? May be it removes NPE but it 
>>>> puzzles me. So if buffer.length() == 0 you invoke 
>>>> sendCommittedText, right? But sendCommittedText commits buffer, but 
>>>> buffer is empty. Looks strange...
>>>>
>>>> BTW: the code like "if (!notInCompositionMode) {" a little bit 
>>>> difficult to understand =) I'd preffer to avoid two negations and 
>>>> use "if (notInCompositionMode)" and swap if/else blocks...
>>>>
>>>> Regards, Pavel
>>>>
>>> Hi Pavel,
>>>
>>> Sorry for the confusion. Here is some explanation, please correct me 
>>> if I am wrong:
>>> 1. There two modes which is judge from the buffer size: composed 
>>> mode when the buffer size is not zero and normal mode when the 
>>> buffer size is zero.
>> Right
>>> 2. The original code make no difference whether it is in the 
>>> composed mode or normal mode. In the normal mode, which buffer size 
>>> is zero, it sends the committed text. In the composed mode, which 
>>> buffer size is not zero, it also sends the committed code. And NPE 
>>> occurred here.
>>> 3. In the patch, I do not change the logic when in the normal mode. 
>>> (notInCompositionMode branch)  Why? I guess it is the logic of "Ends 
>>> any input composition that may currently be going on in this 
>>> context. Depending on the platform and possibly user preferences, 
>>> this may commit or delete uncommitted text." from the api spec....
>> Yes. But after your change the following code looks strange for  me:
>>         if (!notInCompositionMode) {
>>            ....
>>         } else {
>> >>>>            sendCommittedText();
>>         }
>> So if we are not in composition mode we send something (empty string 
>> actually). Logically we shouldn't send anything (IMO), because buffer 
>> is empty. Why should we do something at all if endComposition is 
>> invoked and we are not in composition mode?
>>> 4. In the patch, the logic in the composed mode is that: if it is in 
>>> the composed mode, keep every thing as just composed :-)
>>
>> I found a new bug (???) in the fix. If you apply the patch, run the 
>> MouseEventTest2 test and follow the instructions from the bug 
>> description NPE will not be thrown, but the JTextArea remains in 
>> composition mode even after endComposition completion.
>
> Right. It seems that we have to do some thing in the jdk :-). Here it is:
>
> The patch attached is just adding a null check at the beginning of the 
> mouseClicked method in DefaultCaret. So why the component is null in 
> the DefaultCaret? That because the caret has already been deinstalled. 
> It seems to be an order problem of mouse event and the event which 
> endCompositon sent. The endComposition will exchange the caret and 
> deinstall the old one. On the other hand, mouse click event was 
> happening on the old caret. So the component of the old caret is null 
> now. NPE happens.
It looks that you are trying to fix the consequence, but not the root of 
the problem. The endComposition method shouldn't send anything to 
deinstalled DefaultCaret. I think the previous version of the fix was 
much closer than this one.

Regards, Pavel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20111027/04e5fb58/attachment.html>


More information about the swing-dev mailing list