Проблема с загрузчиком нулевого класса IllegalArgumentException

#java #illegalargumentexception

#Ява #незаконное исключение аргумента

Вопрос:

Я получаю IllegalArgumentException сообщение, когда пытаюсь загрузить класс, описывающий JMenuItem свойства a из списка. Чтобы помочь, я включаю соответствующие части своего API и код, который вызывает это исключение.

API выглядит следующим образом:

 public interface MenuCommand extends Comparablelt;MenuCommandgt; {  public String getName();  public String getOwner();  public int getPosition();  public String getActionName();  public default boolean separatorBefore() { return false; }  public default boolean separatorAfter() { return false; } }  

Этот интерфейс определяет javax.swing.JMenuItem , что будет создано в initialize методе моего приложения. Однако, поскольку я делаю приложение полностью подключаемым, я фактически создаю экземпляры различных MenuCommand классов в отдельном модуле, используя следующий интерфейс:

 public interface Plugin {  public String getVersion();  public OptionsPanelProvider getOptionsPanel(); // A custom JPanel implementation.  public Listlt;MenuCommandgt; getMenuItems(); // Retrieves all of the items I am having the issue with.  public Listlt;MenuProvidergt; getMenus(); // Works as expected in the application.  public Listlt;ToolbarCommandgt; getToolbarButtons(); // May experience this same issue again loading these...  public String getPluginName();  public String getVendorName();  public String getCopyright();  public default Listlt;Stringgt; getContributors() { return Collections.emptyList(); } }  

initialize() Метод моего приложения вызывает вызываемый частный метод loadModules , который загружает все последние реализации интерфейса в ArrayListlt;Plugingt; переменную. Как только модули плагина загружены, я вызываю метод с именем buildMainMenu , который извлекает все MenuProvider s из каждого плагина и загружает их в меню главного окна, и этот метод отлично работает.

Как только в главном меню будут загружены все меню верхнего уровня и подменю из различных установленных плагинов, initialize затем вызовет addMenuItems загрузку реализаций интерфейса former ( MenuCommand ) в соответствующие меню, и именно там будет создано это исключение. Вот код, который не работает:

 private void addMenuItems() {  Listlt;MenuCommandgt; allCommands = new ArrayListlt;gt;();   for (Plugin p : modules) {  allCommands.addAll(p.getMenuItems());  }   Collections.sort(allCommands); // Hence the extension of Comparable on the interface.   javax.swing.JMenuBar bar = mainWindow.getMenuBar();  for (int x = 0; x lt; bar.getMenuCount(); x  ) {  javax.swing.JMenu m = bar.getMenu(x);   for (MenuCommand c : allCommands) {  if (m.getName().equals(c.getOwner())) {  m.add(createJMenuItem(c));  }  }  } }  private javax.swing.JMenuItem createJMenuItem(MenuCommand c) {  ResourceMap resMap = getContext().getResourceMap(c.getClass());   //vvv This is the line throwing the exception vvv\  ActionMap actMap = getContext().getActionMap(c.getClass());   javax.swing.JMenuItem item = new javax.swing.JMenuItem();  item.setName(c.getName());  item.setAction(actMap.getAction(c.getActionName()));  getContext().getSessionStorage().injectComponent(item);   return item; }  

If the individual MenuCommand implementations that are stored in the Plugin ‘s getMenuItems list have already been initialized (loaded), they should have a ClassLoader associated with them. When I break execution on the problem line, the c class has a ClassLoader , but I do see a couple of null property values:

 c.getClass().getClassLoader().URLClassPath = #1975 c.getClass().getClassLoader().URLClassPath.path = ArrayList.size = 0 c.getClass().getClassLoader().URLClassPath.unopenedUrls = ArrayDeque.size = 0 c.getClass().getClassLoader().URLClassPath.loaders = ArrayList.size = 0 c.getClass().getClassLoader().URLClassPath.Imap = HashMap.size = 0 c.getClass().getClassLoader().URLClassPath.jarHandler = null c.getClass().getClassLoader().URLClassPath.closed = false c.getClass().getClassLoader().URLClassPath.acc = null  

Furthermore, from the static section of the ClassLoader , the usr_paths array has a length of 5, containing various JDK-related paths. The sys_paths array has a length of 1, pointing to the /usr/lib/jvm/jdk-11.0.12/lib folder, as it should. The packageToModule array has a size of 1079. The ClassLoader$AppClassLoader properties are identical to those listed above.

Attempts to solve

In an attempt to solve this issue, I have tried not using the Listlt;Plugingt; modules.getMenuItems() method, but to use the ServiceLoaderlt;MenuCommandgt;.load method to see if that would do it, but it did not.

I have read through numerous ServiceLoader , ClassLoader , and other documentation, including the book about the Java Virtual Machine that I have, but have not been able to discover what I am missing.

I have looked at other questions about similar issues, but they have not helped either. I am hoping that posting this question will find me some help. Thank you all for your assistance.

-SC

UPDATE getResourceMap() and getActionMap() are part of a slightly updated version of the JSR-296 org.jdesktop AppFramework. Here is the full stacktrace:

 Dec 01, 2021 8:33:28 AM org.jdesktop.application.Application$1 run SEVERE: Application class com.gs.nta.NTApp failed to launch java.lang.IllegalArgumentException: null ClassLoader  at appframework@1.0.3/org.jdesktop.application.ResourceMap.lt;initgt;(ResourceMap.java:152)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.createResourceMap(ResourceManager.java:436)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.createResourceMapChain(ResourceManager.java:139)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.getClassResourceMap(ResourceManager.java:173)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.getResourceMap(ResourceManager.java:254)  at appframework@1.0.3/org.jdesktop.application.ApplicationContext.getResourceMap(ApplicationContext.java:203)  at appframework@1.0.3/org.jdesktop.application.ActionManager.getActionMap(ActionManager.java:168)  at appframework@1.0.3/org.jdesktop.application.ApplicationContext.getActionMap(ApplicationContext.java:303)  at NTA.Foundation/com.gs.nta.NTApp.createJMenuItem(NTApp.java:709)  at NTA.Foundation/com.gs.nta.NTApp.addMenuItems(NTApp.java:636)  at NTA.Foundation/com.gs.nta.NTApp.initialize(NTApp.java:171)  at appframework@1.0.3/org.jdesktop.application.Application$1.run(Application.java:170)  at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)  at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)  at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)  at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)  at java.base/java.security.AccessController.doPrivileged(Native Method)  at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)  at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)  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)  Exception in thread "AWT-EventQueue-0" java.lang.Error: Application class com.gs.nta.NTApp failed to launch  at appframework@1.0.3/org.jdesktop.application.Application$1.run(Application.java:177)  at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)  at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)  at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)  at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)  at java.base/java.security.AccessController.doPrivileged(Native Method)  at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)  at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)  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) Caused by: java.lang.IllegalArgumentException: null ClassLoader  at appframework@1.0.3/org.jdesktop.application.ResourceMap.lt;initgt;(ResourceMap.java:152)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.createResourceMap(ResourceManager.java:436)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.createResourceMapChain(ResourceManager.java:139)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.getClassResourceMap(ResourceManager.java:173)  at appframework@1.0.3/org.jdesktop.application.ResourceManager.getResourceMap(ResourceManager.java:254)  at appframework@1.0.3/org.jdesktop.application.ApplicationContext.getResourceMap(ApplicationContext.java:203)  at appframework@1.0.3/org.jdesktop.application.ActionManager.getActionMap(ActionManager.java:168)  at appframework@1.0.3/org.jdesktop.application.ApplicationContext.getActionMap(ApplicationContext.java:303)  at NTA.Foundation/com.gs.nta.NTApp.createJMenuItem(NTApp.java:709)  at NTA.Foundation/com.gs.nta.NTApp.addMenuItems(NTApp.java:636)  at NTA.Foundation/com.gs.nta.NTApp.initialize(NTApp.java:171)  at appframework@1.0.3/org.jdesktop.application.Application$1.run(Application.java:170)  ... 13 more  

ОБНОВЛЕНИЕ 2 И, просто для получения дополнительной информации о потоке приложений, вот выходные данные моего регистратора:

 [ENTER] (2021-12-01T14:33:27.942336Z): [SEQ 1]: com.gs.nta.NTApp.initialize - Initializing application and all objects. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [--ide] [ENTER] (2021-12-01T14:33:27.964177Z): [SEQ 3]: com.gs.nta.NTApp.parseArguments - Parsing command-line arguments. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [--ide] TRACE (2021-12-01T14:33:27.966121Z): [SEQ 6]: com.gs.nta.NTApp.parseArguments - development.mode=true; logger.level=TRACE | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [--ide] CONFIG (2021-12-01T14:33:27.969736Z): [SEQ 7]: com.gs.nta.NTApp.parseArguments - Checking to see if the formatted logs argument is present. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [--ide] TRACE (2021-12-01T14:33:27.969981Z): [SEQ 8]: com.gs.nta.NTApp.parseArguments - logging.format=false | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [--ide] [EXIT] (2021-12-01T14:33:27.970190Z): [SEQ 9]: com.gs.nta.NTApp.parseArguments - Done parsing command-line arguments. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] [ENTER] (2021-12-01T14:33:27.970608Z): [SEQ 10]: com.gs.nta.NTApp.loadModules - Loading modules: | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] CONFIG (2021-12-01T14:33:27.980256Z): [SEQ 11]: com.gs.nta.NTApp.loadModules - Plugin Loaded: NTA Properties Manager (GS United Labs) v. NTA_Properties_Manager-1.0-DEV-SNAPSHOT | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] CONFIG (2021-12-01T14:33:27.993990Z): [SEQ 12]: com.gs.nta.NTApp.loadModules - Plugin Loaded: Logging System (GS United Labs) v. Logging_System-5.0-SNAPSHOT | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] CONFIG (2021-12-01T14:33:27.994537Z): [SEQ 13]: com.gs.nta.NTApp.loadModules - Plugin Loaded: Northwind Traders Foundation (GS United Labs) v. Northwind_Traders_Foundation-1.0-DEV-SNAPSHOT | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] [EXIT] (2021-12-01T14:33:27.994737Z): [SEQ 14]: com.gs.nta.NTApp.loadModules - Done loading modules. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] [ENTER] (2021-12-01T14:33:28.045044Z): [SEQ 15]: com.gs.nta.NTApp.buildMainMenu - Building menu system... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] DEBUG (2021-12-01T14:33:28.045355Z): [SEQ 16]: com.gs.nta.NTApp.buildMainMenu - Getting all menus from all installed modules. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] TRACE (2021-12-01T14:33:28.047357Z): [SEQ 17]: com.gs.nta.NTApp.buildMainMenu - Retrieved 6 menus from installed modules. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] DEBUG (2021-12-01T14:33:28.047727Z): [SEQ 18]: com.gs.nta.NTApp.buildMainMenu - Getting only top-level menus from the list of all menus. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] TRACE (2021-12-01T14:33:28.047883Z): [SEQ 19]: com.gs.nta.NTApp.buildMainMenu - Of all 6 menus, 5 were top-level menus. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] TRACE (2021-12-01T14:33:28.048127Z): [SEQ 20]: com.gs.nta.NTApp.buildMainMenu - Of all 6 menus, 5 were menu items. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] [ENTER] (2021-12-01T14:33:28.065047Z): [SEQ 21]: com.gs.nta.NTApp.createJMenu - Creating a java.awt.Menu from the MenuProvider: com.gs.nta.menus.FileMenuProvider@7e9d8d7b | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.FileMenuProvider@7e9d8d7b]  gt;gt;gt; Exception stacktrace located here lt;lt;lt;  [EXIT] (2021-12-01T14:33:28.075770Z): [SEQ 22]: com.gs.nta.NTApp.createJMenu - Menu javax.swing.JMenu[fileMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=File] created and returned. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.FileMenuProvider@7e9d8d7b] [ENTER] (2021-12-01T14:33:28.226546Z): [SEQ 23]: com.gs.nta.NTApp.createJMenu - Creating a java.awt.Menu from the MenuProvider: com.gs.nta.menus.EditMenuProvider@6b3f648a | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.EditMenuProvider@6b3f648a] [EXIT] (2021-12-01T14:33:28.228859Z): [SEQ 24]: com.gs.nta.NTApp.createJMenu - Menu javax.swing.JMenu[editMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Edit] created and returned. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.EditMenuProvider@6b3f648a] [ENTER] (2021-12-01T14:33:28.229384Z): [SEQ 25]: com.gs.nta.NTApp.createJMenu - Creating a java.awt.Menu from the MenuProvider: com.gs.nta.menus.ViewMenuProvider@26a1a787 | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.ViewMenuProvider@26a1a787] [EXIT] (2021-12-01T14:33:28.231477Z): [SEQ 26]: com.gs.nta.NTApp.createJMenu - Menu javax.swing.JMenu[viewMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=View] created and returned. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.ViewMenuProvider@26a1a787] [ENTER] (2021-12-01T14:33:28.232001Z): [SEQ 27]: com.gs.nta.NTApp.createJMenu - Creating a java.awt.Menu from the MenuProvider: com.gs.nta.menus.ToolsMenuProvider@2b41cd51 | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.ToolsMenuProvider@2b41cd51] [EXIT] (2021-12-01T14:33:28.234856Z): [SEQ 28]: com.gs.nta.NTApp.createJMenu - Menu javax.swing.JMenu[toolsMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Tools] created and returned. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.ToolsMenuProvider@2b41cd51] [ENTER] (2021-12-01T14:33:28.235381Z): [SEQ 29]: com.gs.nta.NTApp.createJMenu - Creating a java.awt.Menu from the MenuProvider: com.gs.nta.menus.HelpMenuProvider@2ee9de63 | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.HelpMenuProvider@2ee9de63] [EXIT] (2021-12-01T14:33:28.237675Z): [SEQ 30]: com.gs.nta.NTApp.createJMenu - Menu javax.swing.JMenu[helpMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Help] created and returned. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.HelpMenuProvider@2ee9de63] TRACE (2021-12-01T14:33:28.238275Z): [SEQ 31]: com.gs.nta.NTApp.createJMenu - Built the java.awt.MenuBar (javax.swing.JMenuBar[menuBar,0,0,0x0,invalid,layout=javax.swing.plaf.basic.DefaultMenuLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuBarBorder@3ee2e400,flags=392,maximumSize=,minimumSize=,preferredSize=,margin=,paintBorder=true]) and setting it as the menuBar on the mainFrame. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.HelpMenuProvider@2ee9de63] TRACE (2021-12-01T14:33:28.239715Z): [SEQ 32]: com.gs.nta.NTApp.createJMenu - mainWindow.getJMenuBar() == javax.swing.JMenuBar[menuBar,0,0,0x0,invalid,layout=javax.swing.plaf.basic.DefaultMenuLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuBarBorder@3ee2e400,flags=392,maximumSize=,minimumSize=,preferredSize=,margin=,paintBorder=true] | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.HelpMenuProvider@2ee9de63] [ENTER] (2021-12-01T14:33:28.240156Z): [SEQ 33]: com.gs.nta.NTApp.buildSubMenus - Building sub-menus... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.240356Z): [SEQ 34]: com.gs.nta.NTApp.buildSubMenus - Checking menus.getSize() gt; 1: false | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.240641Z): [SEQ 35]: com.gs.nta.NTApp.buildSubMenus - Got menu, javax.swing.JMenu[fileMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=File], from the menubar on the mainFrame. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] [ENTER] (2021-12-01T14:33:28.241015Z): [SEQ 36]: com.gs.nta.NTApp.createJMenu - Creating a java.awt.Menu from the MenuProvider: com.gs.nta.menus.NewMenuProvider@15d4f1c4 | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] [EXIT] (2021-12-01T14:33:28.243433Z): [SEQ 37]: com.gs.nta.NTApp.createJMenu - Menu javax.swing.JMenu[fileNewMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=New] created and returned. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] [EXIT] (2021-12-01T14:33:28.248355Z): [SEQ 38]: com.gs.nta.NTApp.buildSubMenus - Added the menu created from MenuProvider (com.gs.nta.menus.NewMenuProvider@15d4f1c4) to the menubar. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.248355Z): [SEQ 39]: com.gs.nta.NTApp.buildSubMenus - Added the menu created from MenuProvider (com.gs.nta.menus.NewMenuProvider@15d4f1c4) to the menubar. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.248838Z): [SEQ 40]: com.gs.nta.NTApp.buildSubMenus - Got menu, javax.swing.JMenu[editMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Edit], from the menubar on the mainFrame. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.249261Z): [SEQ 41]: com.gs.nta.NTApp.buildSubMenus - (p.getOwnerName()=fileMenu) != (m.getName()=editMenu): moving on... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.249519Z): [SEQ 42]: com.gs.nta.NTApp.buildSubMenus - Got menu, javax.swing.JMenu[viewMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=View], from the menubar on the mainFrame. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.251184Z): [SEQ 43]: com.gs.nta.NTApp.buildSubMenus - (p.getOwnerName()=fileMenu) != (m.getName()=viewMenu): moving on... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.251751Z): [SEQ 44]: com.gs.nta.NTApp.buildSubMenus - Got menu, javax.swing.JMenu[toolsMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Tools], from the menubar on the mainFrame. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.253902Z): [SEQ 45]: com.gs.nta.NTApp.buildSubMenus - (p.getOwnerName()=fileMenu) != (m.getName()=toolsMenu): moving on... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.254924Z): [SEQ 46]: com.gs.nta.NTApp.buildSubMenus - Got menu, javax.swing.JMenu[helpMenu,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@74ee4a2b,flags=256,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Help], from the menubar on the mainFrame. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] TRACE (2021-12-01T14:33:28.255386Z): [SEQ 47]: com.gs.nta.NTApp.buildSubMenus - (p.getOwnerName()=fileMenu) != (m.getName()=helpMenu): moving on... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] [EXIT] (2021-12-01T14:33:28.255617Z): [SEQ 48]: com.gs.nta.NTApp.buildSubMenus - Sub-menus have all been added to the menu system. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.NewMenuProvider@15d4f1c4] [EXIT] (2021-12-01T14:33:28.255792Z): [SEQ 49]: com.gs.nta.NTApp.buildMainMenu - Menu system built. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] [ENTER] (2021-12-01T14:33:28.255941Z): [SEQ 50]: com.gs.nta.NTApp.addMenuItems - Adding menu items to the menus... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] CONFIG (2021-12-01T14:33:28.256095Z): [SEQ 51]: com.gs.nta.NTApp.addMenuItems - Getting all registered menu commands... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] TRACE (2021-12-01T14:33:28.264841Z): [SEQ 52]: com.gs.nta.NTApp.addMenuItems - Retrieved a total of 3 menu commands. | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] CONFIG (2021-12-01T14:33:28.265224Z): [SEQ 53]: com.gs.nta.NTApp.addMenuItems - Sorted the menu commands. Now loading them into the application menus... | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE] [ENTER] (2021-12-01T14:33:28.265478Z): [SEQ 54]: com.gs.nta.NTApp.createJMenuItem - Creating a javax.swing.JMenuItem from the MenuProvider: com.gs.nta.menus.ExitCommand@514e805f | (Thread AWT-EventQueue-0 [ID=16; PRIORITY=6; STATE=RUNNABLE]: Parameter(s): [com.gs.nta.menus.ExitCommand@514e805f]  

Комментарии:

1. Что такое getContext() и getActionMap(someClass) ? Стандартные качели просто есть getActionMap() . Возможно, вы используете jdesktop? Также отсутствует полная трассировка стека и сообщение об этом исключении. Вы вставили много, но не самые важные части.

2. ОБНОВЛЕНИЕ : Я попытался создать интерфейс маркера ActionsClass , который просто отмечал бы любой класс , содержащий метод, украшенный @Action аннотацией, затем обновил свой Plugin интерфейс, чтобы иметь метод public default Classlt;ActionsClassgt; getActionsClass() { return Actions.class; } , но все равно получил то же IllegalArgumentException самое для a null ClassLoader . Итак, я все еще зациклен на этом…

3. @rzwitserloot, мои извинения… Да, я использую jdesktop AppFramework (немного обновлено), и сейчас я публикую трассировку стека.

Ответ №1:

Просматривая org.jdesktop.application.ApplicationAction класс, я обнаружил свою (крайне новичковую) ошибку в addMenuItem методе. Строка кода, которая взорвалась вместе с IllegalArgumentException was:

 ApplicationActionmap actMap = getContext().getActionMap(c.getClass());  

Я обнаружил ошибку в этой строке, просматривая ApplicationAction исходный код класса, чтобы убедиться, что я ничего не сломал в нем, когда обновлял его. Я обнаружил это — вы передаете не класс getActionMap , а экземпляр класса:

 actMap = getContext().getActionMap(c.getClass()); // WRONG! actMap = getContext().getActionMap(c)) // Correct!!!  

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

[РЕШЕНО] Передайте экземпляр класса , содержащего действие getActionMap , не самому классу.