当前位置: 首页 > 面试题库 >

取消文件打开对话框后的InterruptedException-1.6.0_26

云丰
2023-03-14
问题内容

以下代码的输出是:

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,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被抛出。或者,如果您选择一个文件并“打开”,然后退出程序,则会引发相同的错误。在这个博客上,用示例代码解释了同样的事情,他的解决方案是尽快调用new JFileChooser();,而我这样做没有任何效果。

这是1.6.0_26中的错误吗?如果是这样,该版本是否有解决方法?

是代码吗?如果是这样,如何解决?(查找的可能性较小,另外2个空结果-现在已删除其中一个。)


问题答案:

我会说这是一个小错误sun.awt.Disposer

该类创建“ Java2D
Disposer”守护程序线程,该线程处理处置垃圾收集对象(主要是AWT窗口)的AWT资源。大多数情况下,线程在其参考队列上等待新的一次性对象被垃圾回收。当线程中断时,它将显式打印该异常。

JVM终止时,它将中断所有线程。在某些情况下-显然受JFileChooser的使用和它所初始化的子系统的影响-
在此中断之后,某些线程仍然有机会运行。在这种情况下InterruptedException,“ Java2D
Disposer”线程中将引发,因为它正在等待锁。如果它在关闭期间忽略该异常会更好。

解决方法是更换

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);
    }
});


 类似资料:
  • 当我按下文件打开对话框上的取消按钮时(代码如下),我收到以下错误: 错误显示为模式弹出窗口: 到目前为止,我只在Mac电脑上测试过。 我的代码如下: 处理创建对话框的主要过程代码如下: 我的调试器语句从未到达。此外,当实际选择了一些文件时,代码工作正常,只有在按下“取消”时才会失败。 触发IPC调用的代码(ES6 JSX)如下所示: 代码通过巴别塔6进行处理。我的如下: 电子版本:. babel依

  • 问题内容: 我需要一种解决方案,以在单击时以HTML显示打开文件对话框。单击时,必须打开打开文件对话框。 我不想将输入文件框显示为HTML页面的一部分。它必须显示在单独的对话框中,该对话框不是网页的一部分。 问题答案: 这是一个不错的 它本身就是一个控件。但是div放在上面,并应用CSS样式来获得那种感觉。文件控件的不透明度设置为0,以便在单击div时似乎打开了对话框窗口。

  • 我试图将openFiles()方法的内脏移到actionPerformed()方法中的相应位置,但仍然没有起作用。但是,在另一个人用于不同目的的代码中,showOpenDialog()方法在从actionPerformed方法内部调用的方法中工作。代码如下: 谢谢你的帮助。

  • 我是Java的初学者。我正在使用netbeans 7.3 IDE的GUI编辑器制作一个简单的文本编辑器。我面临的主要问题是无法保存/打开文件。我已经创建了“保存”按钮。当我删除文件选择器时,它是一个嵌入在java窗口中的正常打开的文件对话框,没有任何功能。我还尝试在单击save按钮(在源代码视图中)时创建一个新的jFileChooser,但它不起作用 简而言之,我需要一个简单的打开/保存对话框。当

  • 问题内容: 我想知道是否有跨平台的方法可以从Java Swing应用程序内部模拟Windows“打开方式”对话框。我的应用程序是用于学习软件包的编辑器,并且其中一个用户希望能够在应用程序中从他们选择的编辑器中打开内容文件,资源通常是HTML文件,图像,CSS,JavaScript,但可以是任何类型可以在浏览器中运行的内容。谢谢 问题答案: 我认为您可以使用JDIC(Java桌面集成组件)来做一些事

  • 我已经使用进度条来指示页面正在android WebView中加载。但是进度条会永远显示,即使页面已经完全加载。我使用logcat进行调试,它显示调用了onPageFinished函数。