java – InterruptedException取消文件打开对话框 – 1.6.0_26

前端之家收集整理的这篇文章主要介绍了java – InterruptedException取消文件打开对话框 – 1.6.0_26前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码输出是:
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);
    }
});

猜你在找的Java相关文章