JFileChooser失败

3
在我的代码中的某个点上,我有以下代码:
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()方法清除系统属性(设置为null)返回旧值(呃呃呃呃)。clearProperty()方法可能是因为自动完成而误输入的。

谢谢大家。会给你们点赞的...


你的代码中的 "this" 是指什么? - jzd
这是一个JFrame,它从JButton中获取ActionEvent以弹出JFleChooser。 - PeterMmm
你什么时候调用这段代码?它看起来像是初始化代码,你真的想在启动时打开文件选择器吗? - Thomas
确保所有GUI调用都在EDT上进行。为了更快地获得帮助,请发布一个SSCCE - Andrew Thompson
我的SSCCE运行良好...将检查我的原始代码是否包含EDT... - PeterMmm
在代码中添加一些上下文信息,从哪里调用了 selectRoot 使程序崩溃了?而从哪里运行就正常? - james_bond
3个回答

3

确保从EDT运行showOpenDialog。如果您从另一个线程调用此方法,可能会导致各种错误:

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

另请参见初始线程 - trashgod

1

这对我来说是个工作:

        import javax.swing.JDialog;
        import javax.swing.JFileChooser;
        import javax.swing.JFrame;


        public class MyDialog extends JDialog {

            public MyDialog(){
                super(new JFrame("prova"));
            }

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


            public static void main(String[] args) throws Exception{
                MyDialog myDialog = new MyDialog();
                myDialog.show(true);
                myDialog.selectRoot();
            }

        }

请告诉我您是否仍然遇到同样的问题。 - Shilaghae

1

或许这可以帮助你

new JFileChooser(System.getProperty("user.home"));

最终,由于我清除了user.dir,所以那段代码将会起作用 :-)。已接受。 - PeterMmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接