我在以下简单代码中收到 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() );
当然,我对此无能为力。我通过的默认 FSVFileSystemView.getFileSystemView()
是 a WindowsFileSystemView
(适合我的操作系统),但是一旦使用它就会 NPE 退出。
虚拟 FSV 实际上会打开文件对话框,但我无法浏览我的文件夹,因为它不是 Windows FSV。所以它只是一个非常有限的用途。