使用FileDialog时出现无法捕获的异常

mingshun 发布于 2012/06/27 10:21
阅读 606
收藏 0
FileDialog openDialog = new FileDialog(MonitorFrame.this, "打开", FileDialog.LOAD);

openDialog.setVisible(true);

上述运行第二行代码,显示打开对话框选择文件按确定就出现下列的异常信息,并且程序里无法捕获,只在控制台上看到:

Exception in thread "Thread-1" java.lang.NullPointerException
    at sun.awt.X11.GtkFileDialogPeer.setFileInternal(GtkFileDialogPeer.java:79)
    at sun.awt.X11.GtkFileDialogPeer.run(Native Method)
    at sun.awt.X11.GtkFileDialogPeer.showNativeDialog(GtkFileDialogPeer.java:172)
    at sun.awt.X11.GtkFileDialogPeer.access$000(GtkFileDialogPeer.java:39)
    at sun.awt.X11.GtkFileDialogPeer$1.run(GtkFileDialogPeer.java:114)

感觉是不是JDK的Bug还是GTK的问题?如果使用FileDialog.LOAD来保存文件就没发现这个问题。

运行环境:ubuntu 12.04 LTS、Oracle JDK 7u4

以下是问题补充:

@mingshun:上面写错了,应该是使用FileDialog.SAVE模式来保存文件时没有发生错误 (2012/06/28 08:27)
@mingshun:使用OpenJDK7也出现同样的问题,现在打算把源码翻出来看看。 (2012/06/28 08:32)
加载中
0
mingshun
mingshun

自己来解答一下吧,从OpenJDK的源代码中找到答案了。

下面是抛出异常的代码段(GtkFileDialogPeer.java源于OpenJDK7):

setFileInternal方法应该是一个回调方法,因为找不到其他地方有调用它的地方。它应该是由本地方法调用,将在GTK文件对话框中选择到的文件路径传回到JVM中。从代码79行可以看到设置directory时需要判断是否需要添加文件分隔符,但在调用String#endsWith(String)之前没有检查directory是否为null。当directory为null时,运行到String#endsWith(String)就抛NullPointerException了。

而翻查了一下JDK的更新记录,即代码注释写的Fix 6987233,发现应该是这个fix引入了这个bug,这是fix前后的对比(http://hg.openjdk.java.net/jdk7/awt/jdk/rev/a014255d826c

):

上述fix在2010年10月加入的,而openjdk的bug报告中显示在2012年1月就已经有此bug(https://bugs.openjdk.java.net/show_bug.cgi?id=100221)的记录了,可惜到现在还没有人提交patch。

返回顶部
顶部