代号一-Form.initLaf引发随机的“非法访问”错误

时间:2019-03-04 12:05:21

标签: error-handling codenameone illegalaccessexception

在我的应用中,在看似随机的位置和时间出现“ 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 类的方法。 当我打开新表单,对话框(从Form继承)或涉及创建新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>
 }

2 个答案:

答案 0 :(得分:2)

设置了第二个开发环境,将我的git项目一对一地导入后,没有任何问题,并且还注意到此错误不会在移动设备上发生,该问题可能仅限于我的特定环境。

我仍然不知道为什么会这样,但影响可以忽略不计。

答案 1 :(得分:0)

之所以会发生这种情况,是因为您没有足够早地在代码中调用Util.register()。请注意,您不应该在init(Object)回调之前这样做。

但是,如果在调用对象之前读取/写入对象(例如,由于静态初始化程序的结果),则会产生类似的异常。

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

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

该对象无法读取自身。