来自代码名的NullPointException一个代码

时间:2019-03-19 08:14:19

标签: java codenameone

从几天前开始,我有时收到此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)

它不是来自我的代码,我也不知道如何解决此间歇性错误。

请帮助我!

2 个答案:

答案 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违例检测工具,您可以启用该工具。在启用此工具的情况下运行时,它将打印可疑违规的堆栈跟踪。请注意,在某些情况下,它会产生“误报”,但在这种情况下,通常情况下相当不错。