Netbeans13打开项目/浏览文件报IllegalArgumentException异常
Netbeans 13 打开项目触发IllegalArgumentException问题
问题现象
在Netbeans 13中执行打开项目、点击浏览按钮选择文件等调用系统文件选择器的操作时,会弹出如下错误提示,文件选择窗口无法正常显示,新建项目功能可正常使用。分别使用JDK8、JDK11作为Netbeans运行环境,问题均会复现。
java.lang.IllegalArgumentException 异常已发生。
请前往Netbeans官方问题反馈渠道提交报告,提交时请将messages.log日志文件作为附件一并上传。
问题现象参考截图:
错误日志
JDK8运行环境错误栈
java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:866) at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:483) at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:422) at java.util.ComparableTimSort.sort(ComparableTimSort.java:222) at java.util.Arrays.sort(Arrays.java:1246) at sun.awt.shell.Win32ShellFolderManager2.get(Win32ShellFolderManager2.java:282) at sun.awt.shell.ShellFolder.get(ShellFolder.java:258) at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.addItem(MetalFileChooserUI.java:942) at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.access$800(MetalFileChooserUI.java:910) at javax.swing.plaf.metal.MetalFileChooserUI.doDirectoryChanged(MetalFileChooserUI.java:659) at javax.swing.plaf.metal.MetalFileChooserUI.access$1100(MetalFileChooserUI.java:53) at javax.swing.plaf.metal.MetalFileChooserUI$5.propertyChange(MetalFileChooserUI.java:748) at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327) at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) at java.awt.Component.firePropertyChange(Component.java:8434) at javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:598) at javax.swing.JFileChooser.<init>(JFileChooser.java:344) at javax.swing.JFileChooser.<init>(JFileChooser.java:296) at org.netbeans.modules.project.ui.ProjectChooserAccessory$ProjectFileChooser.<init>(ProjectChooserAccessory.java:507) at org.netbeans.modules.project.ui.ProjectChooserAccessory$ProjectFileChooser.<init>(ProjectChooserAccessory.java:507) at org.netbeans.modules.project.ui.ProjectChooserAccessory.createProjectChooser(ProjectChooserAccessory.java:442) at org.netbeans.modules.project.ui.actions.OpenProject.actionPerformed(OpenProject.java:61) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) at java.awt.Component.processMouseEvent(Component.java:6539) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6304) at java.awt.Container.processEvent(Container.java:2239) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2297) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at java.awt.Container.dispatchEventImpl(Container.java:2283) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue$4.run(EventQueue.java:733) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136) [catch] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
JDK11运行环境错误栈
java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.base/java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:870) at java.base/java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:487) at java.base/java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:426) at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:222) at java.base/java.util.Arrays.sort(Arrays.java:1249) at java.desktop/sun.awt.shell.Win32ShellFolderManager2.get(Win32ShellFolderManager2.java:313) at java.desktop/sun.awt.shell.ShellFolder.get(ShellFolder.java:259) at java.desktop/javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.addItem(MetalFileChooserUI.java:1029) at java.desktop/javax.swing.plaf.metal.MetalFileChooserUI.doDirectoryChanged(MetalFileChooserUI.java:717) at java.desktop/javax.swing.plaf.metal.MetalFileChooserUI$5.propertyChange(MetalFileChooserUI.java:806) at java.desktop/java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:341) at java.desktop/java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333) at java.desktop/java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:266) at java.desktop/java.awt.Component.firePropertyChange(Component.java:8731) at java.desktop/javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:608) at java.desktop/javax.swing.JFileChooser.<init>(JFileChooser.java:362) at java.desktop/javax.swing.JFileChooser.<init>(JFileChooser.java:308) at org.netbeans.modules.project.ui.ProjectChooserAccessory$ProjectFileChooser.<init>(ProjectChooserAccessory.java:507) at org.netbeans.modules.project.ui.ProjectChooserAccessory$ProjectFileChooser.<init>(ProjectChooserAccessory.java:507) at org.netbeans.modules.project.ui.ProjectChooserAccessory.createProjectChooser(ProjectChooserAccessory.java:442) at org.netbeans.modules.project.ui.actions.OpenProject.actionPerformed(OpenProject.java:61) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967) at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308) 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.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297) at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6635) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342) at java.desktop/java.awt.Component.processEvent(Component.java:6400) at java.desktop/java.awt.Container.processEvent(Container.java:2263) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5011) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772) 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.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743) 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:742) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136) [catch] 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)
问题原因
该错误是Windows平台下JDK Swing组件的已知兼容问题:文件选择器初始化时会枚举系统“此电脑”下的所有驱动器、特殊文件夹,当系统存在失效的网络映射驱动器、断开连接的虚拟存储设备、异常第三方Shell扩展时,枚举返回的文件夹对象排序逻辑不满足比较器传递性要求,JDK7之后默认启用的TimSort排序算法检测到契约违反就会抛出该异常,和Netbeans本身的项目模块逻辑无关,更换JDK大版本也无法修复。
解决方案
按优先级依次尝试以下操作即可修复:
- 清理系统异常挂载项:打开“此电脑”,删除所有标记为断开的网络映射驱动器,卸载/弹出不存在的虚拟光驱、已断开的存储设备挂载项,完成后重启Netbeans重试
- 添加JVM启动参数绕过排序校验:找到Netbeans安装目录下
etc/netbeans.conf配置文件,定位到netbeans_default_options配置行,在配置值末尾追加参数-Djava.util.Arrays.useLegacyMergeSort=true,保存后重启Netbeans,该参数会让JDK使用旧版归并排序替代TimSort,跳过比较器契约校验 - 更换IDE外观主题:打开Netbeans设置,在外观配置项中将默认Metal主题更换为Windows原生主题,避开Metal主题下文件选择器的目录枚举排序逻辑
内容的提问来源于stack exchange,提问作者d4rkm1nt
相关产品推荐
相关产品推荐

