以前似乎也发现过,不过都没有注意,今天是在一个很简单的情况下出来的,然后稍微试验了一下就发现,在输入中文以后,程序就不能正常退出了,当然,没有直接使用 System.exit() 方法来暴力退出。这里说一下 Java 的退出方法,一般有两种:
- 调用
System.exit():这就直接让 JVM 退出,相对来讲比较暴力,它不管你还有其他什么线程在运行,直接退出。 - 所有非守护(daemon)线程都结束以后,JVM 自己正确退出。这种方法相对来说比较“优雅”,如果一个要退出必须正确地结束所有相关线程,这是一个很好的习惯。
System.exit(),所以现在碰到上面问题以后并不能完全退出。简单的测试程序如下:
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.AbstractAction;
public class Test extends JFrame {
public Test() {
super("Test");
JTextField tf = new JTextField();
getContentPane().add(tf);
JButton button = new JButton(new AbstractAction("Close") {
public void actionPerformed(ActionEvent event) {
Test.this.dispose();
}
}
);
getContentPane().add(button, BorderLayout.SOUTH);
pack();
setVisible(true);
}
public static void main(String[] args) {
new Test();
}
}
在 Windows XP 下,两个版本的 JDK 都重现了这个问题。Linux 暂时没试过。
java version "1.6.0_01" Java(TM) SE Runtime Environment (build 1.6.0_01-b06) Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing) java version "1.5.0_08" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03) Java HotSpot(TM) Client VM (build 1.5.0_08-b03, mixed mode, sharing)
当然绕过问题而解决的办法也不是没有,感觉不是很完美。不过这个问题应该是个 bug。
更新:Linux 似乎没有问题。
java version "1.5.0_06" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode)




Post new comment