以下代码的输出是:
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
。或者,如果您选择一个文件并“打开”它然后退出程序,则会抛出相同的错误。在这个blog上,同样的事情用示例代码解释,他的解决方案是尽快调用new JFileChooser();
,我已经做了没有效果。
这是1.6.0_26中的错误吗?如果是这样,该版本是否有解决办法?
是代码吗?如果是这样,如何解决? (看起来不太可能,另外两个空结果 - 其中一个现在被删除了。)
答案 0 :(得分:12)
我想说这是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);
}
});
答案 1 :(得分:4)
我有类似的问题。我按照thread
的建议修复了它答案 2 :(得分:2)
我的输出略有改动的源版本(现在包含在问题本身的编辑中)是..
java.vendor Sun Microsystems Inc.
java.version 1.6.0_29
java.runtime.version 1.6.0_29-b11
sun.arch.data.model 32
os.name Windows 7
os.version 6.1
os.arch x86
Input File Selected: install.ini.
Input selection cancelled by user.
Press any key to continue . . .
从你的问题来看,似乎重要的一行是:
Input selection cancelled by user.
但之后我在输出中看不到InterruptedException
。
答案 3 :(得分:0)
我在blog post中的代码之间看到的差异是JFileChooser的范围。在博客文章中,对象是onClickedButton函数中的局部变量。在您的示例中,对象是在类级别中定义的。我假设是局部变量为Disposer线程提供了更多时间来清除JFileChooser对象。
当我在示例中的actionPerformed方法块中将文件选择器对象作为局部变量时,未发生异常。我测试了大约十次,都通过eclipse和命令行运行应用程序。没有例外。
如果异常仍然发生,您可以在GUI的构造函数中初始化文件选择器对象,但不将其分配给任何内容。我在这里假设它可以作为一个重型摆动物体的早期初始化和处理。
希望这会有所帮助。
答案 4 :(得分:0)
尝试使用JFileChooser时添加System.gc()
调用。这个调用修复了文件锁的问题。