Codenameone 调查代号为One的iOS应用程序上的Java.Lang.NullPointerException
今天我试图调查这个问题: 我写这封信是想问我怎样才能准确地找出哪里出了问题。这个bug令人沮丧 基本上,仅在iOS上,我有一个错误,在一些随机应用程序使用后发生:Codenameone 调查代号为One的iOS应用程序上的Java.Lang.NullPointerException,codenameone,Codenameone,今天我试图调查这个问题: 我写这封信是想问我怎样才能准确地找出哪里出了问题。这个bug令人沮丧 基本上,仅在iOS上,我有一个错误,在一些随机应用程序使用后发生: java.lang.NullPointerException at com_codename1_ui_Form.pointerReleased:3758 at net_informaticalibera_cn1_simpleapi_OuterForm.pointerReleased:360 at com_cod
java.lang.NullPointerException
at com_codename1_ui_Form.pointerReleased:3758
at net_informaticalibera_cn1_simpleapi_OuterForm.pointerReleased:360
at com_codename1_ui_Component.pointerReleased:4679
at com_codename1_ui_Display.handleEvent:2289
at com_codename1_ui_Display.edtLoopImpl:1214
at com_codename1_ui_Display.mainEDTLoop:1132
at com_codename1_ui_RunnableWrapper.run:120
at com_codename1_impl_CodenameOneThread.run:176
at java_lang_Thread.runImpl:153
我已经重写了pointerReleased
方法,以查看在引发上一个异常时x
和y
是否是可接受的值,看起来是这样的:
@Override
public void pointerReleased(int x, int y) {
try {
super.pointerReleased(x, y);
} catch (Exception ex) {
Log.p("OuterForm.pointerReleased ERROR, x->" + x + ", y->" + y + ", https://github.com/codenameone/CodenameOne/issues/2975");
Log.e(ex);
SendLog.sendLogAsync();
}
}
使用该覆盖,相当于碰撞保护功能,在第一次出现此异常后,TextArea
组件不再可用:轻触它们不会打开VKB
简言之,在
窗体的iOS端口内有一个NullPointerException
:如何发现该方法的哪一行引发异常?我希望找到有助于解决bug的信息。问题是类的方法public void pointerReleased(int x,int y)
的代码都在try中。。。最后
,隐藏异常的实际原因。
为了得到实际原因,我在我的应用程序的BaseForm
类中使用了以下覆盖,它扩展了Form
,并用作所有其他表单的超类:
@Override
public void pointerReleased(int x, int y) {
try {
Component cmp = instance.getResponderAt(x, y);
if (cmp != null) {
cmp.pointerReleased(x, y);
}
} catch (Exception ex) {
Log.p("BaseForm.pointerReleased ERROR, x->" + x + ", y->" + y + ", https://github.com/codenameone/CodenameOne/issues/2975");
Log.e(ex);
SendLog.sendLogAsync();
}
}
正如所料,这给了我错误的实际原因,那是在TextArea
actionListener的lambda表达式中:更具体地说,问题是Container
引用上的revalidate
,在某些情况下可以null
(奇怪的是,这只发生在iOS上)。在那之后,我删除了以前的覆盖(这破坏了一些功能),我修复了我的代码,阻止了null
对象上的revalidate
(带有if
条件)的,但是我不知道如何调试问题如果你在xcode调试器中运行它,它应该会在异常行中断,并给你完整的堆栈跟踪。在本机代码中。嗨,Shai,不幸的是xcode没有在异常行停止,这就是为什么我需要一个关于调试此类问题的更详细的建议。由Xcode生成的本机日志具有与我在这里报告的相同的堆栈跟踪。我找到了一个解决方案来解决这个问题,而不需要Xcode。我对我的问题补充了一个答案。