从几天前开始,我有时收到此NullPointException错误:
异常:java.lang.NullPointerException-尝试调用虚拟 null上的方法'boolean java.util.ArrayList.add(java.lang.Object)' 对象参考03-19 09:08:47.785 22799-22820 /? W / System.err: java.lang.NullPointerException:尝试调用虚拟方法 空对象上的'boolean java.util.ArrayList.add(java.lang.Object)' 参考 在com.codename1.r.an.cj(TextArea.java:1199) 在com.codename1.r.an.ci(TextArea.java:865) 在com.codename1.r.an.H(TextArea.java:879) 在com.codename1.r.an.F(TextArea.java:824) 在com.codename1.r.g.b.a(DefaultLookAndFeel.java:907) 在com.codename1.r.an.a(TextArea.java:1259) 在com.codename1.r.l.J(Component.java:2942) 在com.codename1.r.l.K(Component.java:2981) 在com.codename1.r.l.aa(Component.java:1340) 在com.codename1.r.l.af(Component.java:1430)03-19 09:08:47.786 22799-22820 /? W / System.err:位于 com.codename1.r.e.a.b(BorderLayout.java:480) 在com.codename1.r.n.a(Container.java:2224) 在com.codename1.r.l.J(Component.java:2942) 在com.codename1.r.l.K(Component.java:2981) 在com.codename1.r.l.aa(Component.java:1340) 在com.codename1.r.l.af(Component.java:1430) 在com.codename1.r.e.b.a(BoxLayout.java:155) 在com.codename1.r.n.bP(Container.java:1715) 位于com.codename1.r.n.K(Container.java:1707) 在com.codename1.r.n.bP(Container.java:1720) 位于com.codename1.r.n.K(Container.java:1707) 在com.codename1.r.n.bP(Container.java:1720) 位于com.codename1.r.n.K(Container.java:1707) 在com.codename1.r.n.bP(Container.java:1720) 位于com.codename1.r.n.K(Container.java:1707) 在com.codename1.r.n.a(Container.java:1606) 在com.codename1.r.v.a(Form.java:4046) 在com.codename1.r.l.b(Component.java:2214) 在com.codename1.r.v.b(Form.java:4056) 在com.codename1.r.l.d(Component.java:2187) 在com.codename1.r.l.a(Component.java:2162)03-19 09:08:47.787 22799-22820 /? W / System.err:位于 com.codename1.r.l.d(Component.java:2130) 在com.codename1.r.l.c(Component.java:2421) 在com.codename1.r.l.i(Component.java:2365) 在com.codename1.impl.a.s(CodenameOneImplementation.java:613) 在com.codename1.r.q.l(Display.java:1161) 在com.codename1.r.q.k(Display.java:1070) 在com.codename1.r.aj.run(RunnableWrapper.java:120) 在com.codename1.impl.b $ 1.run(CodenameOneThread.java:60) 在java.lang.Thread.run(Thread.java:776)
它不是来自我的代码,我也不知道如何解决此间歇性错误。
请帮助我!
答案 0 :(得分:1)
已更新 TextArea是一个UI组件,因此所有交互都应在codenameOne事件分配线程(EDT)上进行。
在TextArea的代号主文件中,变量rowText
在方法内部声明并且具有优先调用权,因此它不是null。因此,罪魁祸首似乎是rowStrings.add(rowText)
。
在以下位置报告堆栈跟踪: https://github.com/codenameone/CodenameOne/blob/master/CodenameOne/src/com/codename1/ui/TextArea.java#L1199
rowStrings是一个实例成员,但它不是最终成员,也不是受锁定保护的。
Shai Almog points out in his answer:对TextArea的任何操作都应在EDT上进行。 TextArea作为UI组件无需担心并发性。
答案 1 :(得分:1)
这些问题大部分是由于比赛条件和violations of the EDT而引起的。这意味着您在手动创建或通过以下方式获得的单独线程中更改了UI:计时器,网络等。
我们在模拟器中提供了EDT违例检测工具,您可以启用该工具。在启用此工具的情况下运行时,它将打印可疑违规的堆栈跟踪。请注意,在某些情况下,它会产生“误报”,但在这种情况下,通常情况下相当不错。