以下代码的输出是:
java.vendor Sun Microsystems Inc. java.version 1.6.0_26 java.runtime.version 1.6.0_26-b03 sun.arch.data.model 32 os.name Windows XP os.version 5.1 os.arch x86 Input selection cancelled by user. Exception while removing reference: java.lang.InterruptedException java.lang.InterruptedException at java.lang.Object.wait(Native Method) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at sun.java2d.Disposer.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GUI extends JPanel implements ActionListener { private final String newline = System.getProperty("line.separator"); JButton openButton; JTextArea log; JFileChooser fc; public GUI() { super(new BorderLayout()); log = new JTextArea(20,40); log.setMargin(new Insets(5,5,5)); log.setEditable(false); fc = new JFileChooser(); openButton = new JButton("Open"); openButton.addActionListener(this); JPanel buttonPanel = new JPanel(); //use FlowLayout buttonPanel.add(openButton); add(buttonPanel,BorderLayout.NORTH); add(new JScrollPane(log)); showProp("java.vendor"); showProp("java.version"); showProp("java.runtime.version"); showProp("sun.arch.data.model"); showProp("os.name"); showProp("os.version"); showProp("os.arch"); } public void showProp(String name) { output(name + " \t" + System.getProperty(name)); } public void output(String msg) { log.append(msg + newline); log.setCaretPosition(log.getDocument().getLength()); System.out.println(msg); } public void actionPerformed(ActionEvent e) { //Handle open button action. int returnVal = fc.showOpenDialog(GUI.this); if (returnVal == JFileChooser.APPROVE_OPTION) { //This is where a real application would open the file. output( "Input File Selected: " + fc.getSelectedFile().getName() + "."); } else { output("Input selection cancelled by user."); } log.setCaretPosition(log.getDocument().getLength()); } /** * Create the GUI and show it. For thread safety,* this method should be invoked from the * event dispatch thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("IDE Output Converter"); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); //Add content to the window. frame.add(new GUI()); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event dispatch thread: //creating and showing this application's GUI. SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
当我运行程序时,主窗口打开,程序运行正常.
但是,如果你:
>使用’打开文件’按钮打开JFileChooser
>按取消然后
>退出程序
抛出InterruptedException.或者如果您选择一个文件并打开它,然后退出程序,则抛出相同的错误.在这个blog上,同样的事情是用示例代码解释的,他的解决方案是调用新的JFileChooser();尽快,我做了没有效果.
这是1.6.0_26的错误吗?如果是这样,那么该版本是否有效?
解决方法
我会说这是一个小bug在sun.awt.Disposer.
该类创建“Java2D Disposer”守护进程线程,它处理垃圾回收对象(主要是AWT窗口)的AWT资源处理.大多数时间线程等待其引用队列为一个新的一次性对象被垃圾回收.当线程中断时,它会显式打印出该异常.
当JVM被终止时,它将中断所有线程.在某些情况下 – 显然受到JFileChooser的使用和由其初始化的子系统的影响 – 某些线程仍然有机会在此中断后运行.并且在这种情况下,在“Java2D Disposer”线程中抛出InterruptedException,因为它正在等待锁定.如果在关机期间忽略该异常会更好.
作为解决方法,请更换
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
同
frame.setDefaultCloSEOperation(JFrame.DISPOSE_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { PrintStream nullStream = new PrintStream(new OutputStream() { public void write(int b) throws IOException { } public void write(byte b[]) throws IOException { } public void write(byte b[],int off,int len) throws IOException { } }); System.setErr(nullStream); System.setOut(nullStream); System.exit(0); } });