Изучите исключение Java .Lang.NullPointerException в приложении Codename One iOS - PullRequest
2 голосов
/ 12 января 2020

Сегодня я попытался исследовать эту проблему: 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 чтобы увидеть, являются ли 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();
        }
    }

Использование этого переопределения, эквивалентного функции защиты cra sh, после в первый раз, когда это исключение происходит, компоненты TextArea перестают использоваться: нажатие на них не открывает ВКБ.

Короче говоря, внутри порта iOS есть NullPointerException Form.pointerReleased: как я могу узнать, какая строка этого метода вызывает исключение? Я надеюсь найти информацию, которая может помочь в устранении ошибки.

1 Ответ

2 голосов
/ 12 января 2020

Проблема в том, что код метода public void pointerReleased(int x, int y) класса Form находится внутри 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: более конкретно, проблема заключалась в revalidate для ссылки Container, которая может быть null в некоторых обстоятельствах (как ни странно, это происходит только на iOS). После этого я удалил предыдущее переопределение (что нарушало некоторые функции), я исправил свой код, предотвращающий revalidate для объекта null (с условием if), и ошибка исчезла (я провел тест с долгое использование приложения).

...