X2Go单应用模式下Java8迁移至Java17的GUI空指针异常问题
Java 17 + X2Go单应用模式GUI对话框NullPointerException问题解决
问题描述
在CentOS 7.8系统上,通过X2Go客户端将应用从Java 8迁移到Java 17后,运行包含GUI的简单代码(哪怕是仅带一个按钮的对话框)时,会抛出如下NullPointerException异常:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "sun.awt.X11.XBaseWindow.isVisible()" because "parent" is null at java.desktop/sun.awt.X11.XWindowPeer.setToplevelTransientFor(XWindowPeer.java:1688) at java.desktop/sun.awt.X11.XWindowPeer.postInit(XWindowPeer.java:253) at java.desktop/sun.awt.X11.XDecoratedPeer.postInit(XDecoratedPeer.java:105) at java.desktop/sun.awt.X11.XBaseWindow.init(XBaseWindow.java:184) at java.desktop/sun.awt.X11.XBaseWindow.<init>(XBaseWindow.java:259) at java.desktop/sun.awt.X11.XWindow.<init>(XWindow.java:147) at java.desktop/sun.awt.X11.XComponentPeer.<init>(XComponentPeer.java:111) at java.desktop/sun.awt.X11.XCanvasPeer.<init>(XCanvasPeer.java:42) at java.desktop/sun.awt.X11.XPanelPeer.<init>(XPanelPeer.java:48) at java.desktop/sun.awt.X11.XWindowPeer.<init>(XWindowPeer.java:134) at java.desktop/sun.awt.X11.XDecoratedPeer.<init>(XDecoratedPeer.java:62) at java.desktop/sun.awt.X11.XDialogPeer.<init>(XDialogPeer.java:40) at java.desktop/sun.awt.X11.XToolkit.createDialog(XToolkit.java:1084) at java.desktop/java.awt.Dialog.addNotify(Dialog.java:768) at java.desktop/java.awt.Window.pack(Window.java:829)
该问题仅在X2Go单应用模式下触发,KDE模式下无异常,且Java 8中不存在此问题。
解决方案
1. 无所属窗口的JDialog处理
根据JDialog官方文档,创建无所属窗口的JDialog时,必须使用参数为null的JDialog(Window)或JDialog(Dialog)构造方法,可解决主窗口显示前弹出的对话框(如启动画面、密码请求框等)的异常问题。
2. JOptionPane处理
对于JOptionPane,调用JOptionPane#setRootFrame(main_program)指定父窗口,可避免异常,此方法适用于已有可见Window的场景下的JOptionPane异常问题。
内容的提问来源于stack exchange,提问作者Michael Azarzar
相关产品推荐
相关产品推荐

