Codenameone 调查代号为One的iOS应用程序上的Java.Lang.NullPointerException

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

今天我试图调查这个问题: 我写这封信是想问我怎样才能准确地找出哪里出了问题。这个bug令人沮丧

基本上,仅在iOS上,我有一个错误,在一些随机应用程序使用后发生:

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。我对我的问题补充了一个答案。