Кодовое имя один - Form.initLaf выдает случайные ошибки «Незаконный доступ» - PullRequest
0 голосов
/ 04 марта 2019

в моем приложении я получаю ошибки «IllegalAccess» в случайных, казалось бы, местах и ​​времени.Единственная общая черта - трассировка стека:

java.lang.IllegalAccessError: class sun.reflect.GeneratedConstructorAccessor3 cannot access its superclass sun.reflect.ConstructorAccessorImpl
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:55)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
**at com.codename1.ui.Form.initLaf(Form.java:969)**
at com.codename1.ui.Dialog.initLaf(Dialog.java:499)
at com.codename1.ui.Component.<init>(Component.java:687)
at com.codename1.ui.Container.<init>(Container.java:187)
at com.codename1.ui.Container.<init>(Container.java:199)
at com.codename1.ui.Form.<init>(Form.java:181)
at com.codename1.ui.Form.<init>(Form.java:172)
at com.codename1.ui.Dialog.<init>(Dialog.java:288)
at com.codename1.ui.Dialog.<init>(Dialog.java:275)
at com.codename1.ui.Dialog.<init>(Dialog.java:248)
at com.codename1.ui.Dialog.show(Dialog.java:994)
at com.codename1.ui.Dialog.show(Dialog.java:793)
at com.codename1.ui.Dialog.show(Dialog.java:746)
at com.codename1.ui.Dialog.show(Dialog.java:711)
at com.codename1.ui.Dialog.show(Dialog.java:652)
at com.codename1.ui.Dialog.show(Dialog.java:807)
at com.codename1.ui.Display.mainEDTLoop(Display.java:983)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)

Строка, помеченная ** .. **, является моей аннотацией, так как это метод класса Form , который выдаетошибка.Когда я открываю новую форму, диалоговое окно (которое наследуется от формы) или просто все, что связано с созданием новой формы, эта проблема возникает случайным образом.

Я понятия не имею, как отладить это, так каккажется, что это не мой код, который вызывает проблему.

Какие-либо советы по отладке или даже решению проблемы?

РЕДАКТИРОВАТЬ

ошибкане только ограничивается созданием форм, но также может происходить при интернализации объектов.Смотрите трассировку стека:

<same as above stacktrace after Class.newinstance>
at java.lang.Class.newInstance(Class.java:442)
at com.codename1.io.Util.readObject(Util.java:690)
at com.codename1.io.Util.readObject(Util.java:668)
at com.lequi.ep.dtos.ChatDTO.internalize(ChatDTO.java:47)
at com.codename1.io.Util.readObject(Util.java:693)

РЕДАКТИРОВАТЬ 2

с гораздо большим количеством проверок этой проблемы, я нашел один шаблон до сих пор.Независимо от того, какую форму или диалог я создаю, это зависит от того, сколько раз я их создаю.Ровно в 13-й раз, когда я хочу создать экземпляр формы (независимо от того, какой экран), появляется эта ошибка.Мне не нужно ничего делать, просто открываю экран и возвращаюсь.Отрезанный соответствующий код, с которым можно воспроизвести ошибку:

// main form activity 
<omitted for brevity>
chatButton.addActionListener(e -> {
    new ChatScreen(this).show();
});

public ChatScreen(Form origin) {
    super("Chat", new BorderLayout());
    setUIID("ChatHistory");

    getToolbar().setBackCommand("", e -> {
        origin.showBack();
    });
    <omitted for brevity>
 }

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Это может произойти, потому что вы не вызывали Util.register() достаточно рано в коде.Обратите внимание, что вы не должны делать этого до обратного вызова init(Object).

Однако, если вы читаете / записываете объекты до того, как они будут вызваны (например, в результате статического инициализатора), вы получите подобное исключение.

Другие потенциальные проблемы включают код, который возвращает getClass().getName() вместо жестко закодированной строки.Это может плохо провалиться из-за запутывания.Первый шаг - просмотр строки 47 из ChatDTO.Что за объект читается в этой строке и почему?

Также, кто вызывает at com.codename1.io.Util.readObject(Util.java:693) и когда он вызывается?

Объект не читает сам себя.

0 голосов
/ 04 апреля 2019

После настройки среды второго разработчика, импорта моего проекта git один на один без каких-либо проблем, а также с учетом того, что эта ошибка не возникает на самом мобильном устройстве, проблема может быть ограничена моей конкретной средой.

Я до сих пор не знаю, почему это происходит, но влияние пренебрежимо мало.

...