java - JFileChooser 失败

标签 java swing

在我的代码中某个时候我有这段代码

void selectRoot() {
        JFileChooser ch = new JFileChooser();
        ch.showOpenDialog((JFrame)this);
    }

这会抛出异常:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.io.Win32FileSystem.normalize(Win32FileSystem.java:164)
    at java.io.Win32FileSystem.getUserPath(Win32FileSystem.java:296)
    at java.io.Win32FileSystem.resolve(Win32FileSystem.java:312)
    at java.io.File.getAbsolutePath(File.java:501)
    at sun.awt.shell.Win32ShellFolder2.<init>(Win32ShellFolder2.java:291)
    at sun.awt.shell.Win32ShellFolderManager2.createShellFolderFromRelativePIDL(Win32ShellFolderManager2.java:66)
    at sun.awt.shell.Win32ShellFolderManager2.createShellFolder(Win32ShellFolderManager2.java:56)
    at sun.awt.shell.Win32ShellFolderManager2.getRecent(Win32ShellFolderManager2.java:114)
    at sun.awt.shell.Win32ShellFolderManager2.get(Win32ShellFolderManager2.java:251)
    at sun.awt.shell.ShellFolder.get(ShellFolder.java:227)
    at sun.swing.WindowsPlacesBar.<init>(WindowsPlacesBar.java:64)
    at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.updateUseShellFolder(WindowsFileChooserUI.java:505)
    at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.installComponents(WindowsFileChooserUI.java:196)
    at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:136)
    at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.installUI(WindowsFileChooserUI.java:129)
    at javax.swing.JComponent.setUI(JComponent.java:673)
    at javax.swing.JFileChooser.updateUI(JFileChooser.java:1763)
    at javax.swing.JFileChooser.setup(JFileChooser.java:360)
    at javax.swing.JFileChooser.<init>(JFileChooser.java:333)
    at javax.swing.JFileChooser.<init>(JFileChooser.java:286)
    at my.pack.Main.selectRoot(Main.java:184)

查看 java.io.Win32FileSystem.normalize() 的源代码,(当前)路径似乎为空:

   public String normalize(String path) {
        int n = path.length(); // Line: 164
        char slash = this.slash;
        char altSlash = this.altSlash;

如果我从程序中的另一个点运行 selectRoot(),它运行良好......

更新

伙计们,这真是一本关于编程陷阱的好书!

在我的原始代码中有一个 JTextField 保存实际路径并以这种方式进行初始化:

root = new JTextField();
root.setToolTipText("Root folder");
root.setText(System.clearProperty("user.dir"));

System.clearProperty() 清除系统属性(为空)返回旧值 (arrrghhhhhhh)。 clearProperty() 可能从自动完成中滑落。

谢谢大家。会给你一些投票......

最佳答案

确保从美国东部时间运行 showOpenDialog。如果您从另一个线程调用此方法,它可能会导致各种错误:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        JFileChooser ch = new JFileChooser();
        ch.showOpenDialog((JFrame)this);
    }
});

关于java - JFileChooser 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584750/

相关文章:

java - 无法按升序对列表进行排序

java - 如何在 JUnit 中等待 @JMSListener 注解的方法完成

java - 将 Actionlistener 移至单独的类

java - JList 由于某种原因没有更新

java - 向图像添加 Action 监听器

Java - JPanel 与 Canvas

java - jena 从 gzip 压缩文件中读取输入流

java - 如何在 Java 中构造类型?

基于 double 的Java画线(亚像素精度)

java - 我应该学习 swing 来制作 GUI 还是我应该简单地使用任何 IDE