代号一 - Form.initLaf 抛出随机"Illegal Access"错误



在我的应用程序中,我在看似随机的地方和时代会遇到" 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 类的方法。当我打开新表单时,对话框(从表单继承),或者只是任何涉及创建新表单的任何内容,此问题是随机发生的。

我不知道该如何调试,因为似乎不是我的代码引起了问题。

有任何调试甚至解决问题的提示?

编辑

错误不仅限于形式的创建,而且在内部化对象时也可能发生。请参阅StackTrace:

<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>
 }

设置第二个开发环境后,将我的git项目一对一地导入我的git项目,并且还指出,移动设备本身不会发生此错误,可以限制该问题到我的特定环境。

我仍然不知道为什么会发生这种情况,但是影响是可以忽略的。

这可能发生,因为您在代码中没有足够早期调用Util.register()。请注意,在init(Object)回调之前,您不应该这样做。

但是,如果您在调用之前读取/编写对象(例如,由于静态初始化器的结果)将产生这样的例外。

其他潜在问题包括返回getClass().getName()而不是硬编码字符串的代码。由于混淆,这可能会严重失败。第一步是查看ChatDTO的第47行。在该行中读取的对象是什么?

是什么?

还有谁调用at com.codename1.io.Util.readObject(Util.java:693),什么时候调用?

对象不会自行读取自己。

最新更新