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:迁移到模块化项目
- 在项目根目录创建
module-info.java,声明模块并依赖java.sql.rowset:
module your.module.name { requires java.sql.rowset; exports common; // 按需导出自身包 }
- 启动参数改为:
--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
相关产品推荐
相关产品推荐

