You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java IllegalAccessError异常求助:超类访问检查失败问题

Java IllegalAccessError 异常解决方案

异常信息

线程"AWT-EventQueue-0"中出现异常:java.lang.IllegalAccessError:
超类访问检查失败:位于未命名模块@0x372dc8e2的类common.FixedCachedRowSetImpl无法访问位于模块java.sql.rowset的类com.sun.rowset.CachedRowSetImpl,原因是模块java.sql.rowset未向未命名模块@0x372dc8e2导出com.sun.rowset包
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at ffm.FFmDbConnection.dbSelectSQL2(FFmDbConnection.java:224)
    at ffm.FFmUser.getLogInUserInfo(FFmUser.java:442)
    at dialog.DlgLogInMES.checkUserInfo(DlgLogInMES.java:444)
    at dialog.DlgLogInMES.funcLogIn(DlgLogInMES.java:276)
    at dialog.DlgLogInMES.access$0(DlgLogInMES.java:271)
    at dialog.DlgLogInMES$1.actionPerformed(DlgLogInMES.java:96)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6626)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389)
    at java.desktop/java.awt.Component.processEvent(Component.java:6391)
    at java.desktop/java.awt.Container.processEvent(Container.java:2266)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
    at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:191)
    at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:236)
    at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:234)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:234)
    at java.desktop/java.awt.Dialog.show(Dialog.java:1080)
    at java.desktop/java.awt.Component.show(Component.java:1728)
    at java.desktop/java.awt.Component.setVisible(Component.java:1675)
    at java.desktop/java.awt.Window.setVisible(Window.java:1036)
    at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1016)
    at dialog.DlgLogInMES.showDialog(DlgLogInMES.java:399)
    at fopismes.iOPISmain.loadLogInDialog(iOPISmain.java:223)
    at fopismes.iOPISmain.access$0(iOPISmain.java:209)
    at fopismes.iOPISmain$1.run(iOPISmain.java:129)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

错误原因

这是Java 9+模块系统的访问控制限制导致的:

  • 应用类common.FixedCachedRowSetImpl位于未命名模块(传统类路径下,无module-info.java)
  • 该类试图继承JDK内部模块java.sql.rowset中的com.sun.rowset.CachedRowSetImpl
  • 但java.sql.rowset模块未将com.sun.rowset包导出给未命名模块,JVM因此拒绝访问

解决方法

方法1:添加JVM启动参数强制导出包

在应用启动参数中加入以下配置,让java.sql.rowset模块将com.sun.rowset包开放给未命名模块:

--add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED
  • IDE运行:直接在VM options中添加
  • 命令行启动:放在java命令之后、主类之前

方法2:迁移到模块化项目

  1. 在项目根目录创建module-info.java,声明模块并依赖java.sql.rowset:
module your.module.name {
    requires java.sql.rowset;
    exports common; // 按需导出自身包
}
  1. 启动参数改为:
--add-exports java.sql.rowset/com.sun.rowset=your.module.name

替换your.module.name为实际模块名称

方法3:改用标准API实现

com.sun.rowset.CachedRowSetImpl是JDK内部实现,建议替换为标准API:

CachedRowSet rowSet = RowSetProvider.newFactory().createCachedRowSet();

通过RowSetProvider获取CachedRowSet实例,避免依赖内部API,同时兼容模块系统


内容的提问来源于stack exchange,提问作者STARK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:25:35