创建JFileChooser对象时出现Nullpointer异常

时间:2013-11-13 00:52:01

标签: java eclipse swing java-7

我在以下简单代码中获得了Nullpointer异常:

import javax.swing.JFileChooser;

public class Main {

    public static void main(String[] args) {
        JFileChooser chooser = new JFileChooser();
    }

}

抛出的是JFileChooser构造函数。我收到以下异常消息:

Exception in thread "main" java.lang.NullPointerException
    at sun.awt.shell.Win32ShellFolder2.getFileSystemPath(Unknown Source)
    at sun.awt.shell.Win32ShellFolder2.access$400(Unknown Source)
    at sun.awt.shell.Win32ShellFolder2$10.call(Unknown Source)
    at sun.awt.shell.Win32ShellFolder2$10.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我在搜索问题时唯一发现的是关于Java6中的回归的报告,所以我做的第一件事就是更新到JDK 7u45并抛弃所有旧版本垃圾。现在只安装了JRE 7u45和JDK 7u45。

System.getProperty("java.runtime.version")的电话会回复1.7.0_45-b18,所以我应该更新。

但是,我仍然遇到同样的错误。我在Eclipse上运行代码并且从未链接过任何库,而是标准的JRE。

任何线索?

编辑:这是尝试进入JFileChooser构造函数时的调用堆栈:

Thread [main] (Suspended)   
    FileNotFoundException(Throwable).<init>(String) line: 264   
    FileNotFoundException(Exception).<init>(String) line: not available 
    FileNotFoundException(IOException).<init>(String) line: not available   
    FileNotFoundException.<init>(String, String) line: not available    
    FileInputStream.open(String) line: not available [native method]    
    FileInputStream.<init>(File) line: not available    
    Toolkit$1.run() line: not available 
    AccessController.doPrivileged(PrivilegedAction<T>) line: not available [native method]  
    Toolkit.initAssistiveTechnologies() line: not available 
    Toolkit.<clinit>() line: not available
    Component.<clinit>() line: not available
    Main.main(String[]) line: 6 

编辑2 :我发现JFileChooser的哪个部分导致了问题:构造函数的第二个可选参数是FileSystemView,它会导致错误。如果我自己写,它就有效:

static public class DummyFSV extends FileSystemView
    {

        public SingleRootFileSystemView(File root)
        {
            super();
        }

        @Override
        public File createNewFolder(File containingDir)
        {
            return null;
        }

        @Override
        public File getDefaultDirectory()
        {
            return null;
        }

        @Override
        public File getHomeDirectory()
        {
            return null;
        }

        @Override
        public File[] getRoots()
        {
            return null;
        }
    }
    ...
    JFileChooser = new JFileChooser( new DummyFVS() );

当然,我对此无能为力。我通过FileSystemView.getFileSystemView()获得的默认FSV是WindowsFileSystemView(适合我的操作系统),但是一旦使用它就会NPE出来。

虚拟FSV实际上会显示文件对话框,但我无法浏览我的文件夹,因为它不是Windows FSV。所以它的使用非常有限。

1 个答案:

答案 0 :(得分:0)

这是在一台普通的Windows机器上吗?哪个windows版?是否应用了任何更改Explorer命名空间或“文件打开”对话框视图的注册表调整?

我见过类似的问题,其中安装了第三方工具,试图操纵文件打开对话框的视图,这似乎会创建一些不一致的状态,在尝试获取“网络Neigborhood”的路径时会在GetFileSystemPath中导致NullPointerException