Search code examples
nullpointerexceptioncodenameonetoast

Codename One - ToastBar NullPointerException


If user clicks multiple times fast enough on Button which shows ToastBar - ToastBar throws NullPointerException.

Stack:

java.lang.NullPointerException
    (Code 1) at com.codename1.components.ToastBar.updateStatus(ToastBar.java:602)
    at com.codename1.components.ToastBar.access$300(ToastBar.java:84)
    at com.codename1.components.ToastBar$2.run(ToastBar.java:638)
    at com.codename1.ui.Display.processSerialCalls(Display.java:1101)
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1045)
    at com.codename1.ui.Display.invokeAndBlock(Display.java:1154)
    at com.codename1.ui.Display.invokeAndBlock(Display.java:1191)
    at com.codename1.ui.AnimationManager.addAnimationAndBlock(AnimationManager.java:105)
    at com.codename1.ui.ComponentSelector.animateUnlayoutAndWait(ComponentSelector.java:3584)
    at com.codename1.ui.ComponentSelector.slideUpAndWait(ComponentSelector.java:1036)
    at com.codename1.components.ToastBar.setVisible(ToastBar.java:787)
    at com.codename1.components.ToastBar.updateStatus(ToastBar.java:502)
    at com.codename1.components.ToastBar.access$300(ToastBar.java:84)
    at com.codename1.components.ToastBar$2.run(ToastBar.java:638)
    at com.codename1.ui.Display.processSerialCalls(Display.java:1101)
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1045)
    at com.codename1.ui.Display.invokeAndBlock(Display.java:1154)
    at com.codename1.ui.Display.invokeAndBlock(Display.java:1191)
    at com.codename1.ui.AnimationManager.addAnimationAndBlock(AnimationManager.java:105)
    at com.codename1.ui.Container.replaceComponents(Container.java:869)
    at com.codename1.ui.Container.replaceAndWait(Container.java:744)
    at com.codename1.components.ToastBar.updateStatus(ToastBar.java:602)
    at com.codename1.components.ToastBar.access$300(ToastBar.java:84)
    at com.codename1.components.ToastBar$2.run(ToastBar.java:638)
    at com.codename1.ui.Display.processSerialCalls(Display.java:1101)
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1045)
    at com.codename1.ui.Display.invokeAndBlock(Display.java:1154)
    at com.codename1.ui.Display.invokeAndBlock(Display.java:1191)
    at com.codename1.ui.AnimationManager.addAnimationAndBlock(AnimationManager.java:105)
    at com.codename1.ui.Container.replaceComponents(Container.java:869)
    at com.codename1.ui.Container.replaceAndWait(Container.java:744)
    at com.codename1.components.ToastBar.updateStatus(ToastBar.java:602)
    at com.codename1.components.ToastBar.access$300(ToastBar.java:84)
    at com.codename1.components.ToastBar$Status.show(ToastBar.java:325)
    at com.codename1.components.ToastBar.showMessage(ToastBar.java:820)
    at com.codename1.components.ToastBar.showMessage(ToastBar.java:830)
    at com.codename1.components.ToastBar.showErrorMessage(ToastBar.java:858)
    (Code 2) at com.somesite.someapp.somepackage.DigitRoller.copyToClipboard(DigitRoller.java:122)

(Code 1): ToastBar.java, line 602

c.label.getParent().replaceAndWait(c.label, newLabel, CommonTransitions.createCover(CommonTransitions.SLIDE_VERTICAL, true, 300));

(Code 2): DigitRoller.java

protected void copyToClipboard () {
        Clipboard.copyString(sToken);
        ToastBar.showErrorMessage("Copied " + sToken, 1000);
    }

copyToClipboard() is invoked by this ActionListener:

btnCopy.addActionListener((e)-> {
            this.copyToClipboard();
        });

After displaying Exception details in Dialog the app freezes or stops animations by it's own decision. Extremely simple way to crash application.


Solution

  • This seems to be a bug, I added a potential workaround for it here.