【问题标题】:Investigate Java.Lang.NullPointerException on a Codename One iOS app调查 Codename One iOS 应用程序上的 Java.Lang.NullPointerException
【发布时间】:2020-01-12 22:57:25
【问题描述】:

今天我试图调查这个问题:https://github.com/codenameone/CodenameOne/issues/2975 我在这里写信是想问我如何才能确切地找到问题所在。这个错误令人沮丧。

基本上,仅在 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 方法来查看xy 在上一个异常抛出时是否是可接受的值,看起来是这样:

@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。

简而言之,Form.pointerReleased的iOS端口内部有一个NullPointerException:如何发现该方法的哪一行引发了异常?我希望找到可以帮助解决错误的信息。

【问题讨论】:

  • 我可以用 Xcode 运行应用程序,但我不知道如何调试问题
  • 如果您在 xcode 调试器中运行它,它应该会在异常行中断并在本机代码中为您提供完整的堆栈跟踪。
  • 嗨 Shai,不幸的是 Xcode 并没有在异常行上停止,这就是为什么我需要更详细的建议来调试此类问题。 Xcode 生成的本机日志与我在此处报告的堆栈跟踪相同。
  • 我找到了无需 Xcode 即可解决此问题的解决方案。我为我的问题添加了答案。

标签: codenameone


【解决方案1】:

问题是Form类的方法public void pointerReleased(int x, int y)的代码都在try... finally里面,隐藏了异常的真正原因。 为了得到真正的原因,我在我的应用程序的 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 可以是 @987654331 @ 在某些情况下(奇怪的是,这只发生在 iOS 上)。之后,我删除了之前的覆盖(破坏了一些功能),我修复了我的代码以防止null 对象上的revalidate(带有if 条件)并且错误消失了(我已经用长时间使用该应用程序)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多