调用 getter JFileChooser 时出现 NullPointerException

NullPointerException while calling getter JFileChooser

我每次调用 getter 时都会收到 NullPointerException。这是代码:

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class FileChooser extends JFileChooser {
private int result;
private File filename;
private File subFile;
private FileNameExtensionFilter filter;

    public FileChooser() {
        filename = new File(System.getProperty("user.home"));
        filter = new FileNameExtensionFilter("Subtitle Files (*.srt)", "srt");
    }

    public void createAndShowGUI() {
        this.setDialogTitle("Select a file");
        this.setCurrentDirectory(filename);       
        this.setFileFilter(filter);
        result = this.showOpenDialog(this);
        if(result == JFileChooser.APPROVE_OPTION) 
            subFile = this.getSelectedFile();   
        this.setVisible(true);        
    }

    public File getFile() {
        return subFile;
    }

}

我在使用调用 getFile() 函数的变量的任何地方都得到空指针。 foo 在这种情况下。这是片段:

FileChooser fileChooser = new FileChooser();
File foo = fileChooser.getFile();
System.out.println(foo.getName()); //Null-Pointer
System.out.println(foo.getPath()); //Null-Pointer  

更新: 我碰巧有两个 FileChooser 实例,但是,我只想调用一次 createAndShowGUI()。如何在构造函数中初始化所选文件?

嗯,你永远不会打电话给 createAndShowGUI()。在你打电话之前先打电话 getFile()

我认为这是个问题:

if(result == JFileChooser.APPROVE_OPTION) 
        subFile = this.getSelectedFile();  

result == JFileChooser.APPROVE_OPTION return false 且 subFile 从未初始化

根据您的代码,字段 subFile 是在 if condition.

中的方法 createAndShowGUI() 中初始化的

但是,由于您没有调用方法 createAndShowGUI(),当您调用 getFile().

时,字段 subFile 仍然是 null

试试这个代码,

FileChooser fileChooser = new FileChooser();
fileChooser.createAndShowGUI();             // MISSING IN ORIGINAL CODE
File foo = fileChooser.getFile();
System.out.println(foo.getName()); //Null-Pointer
System.out.println(foo.getPath()); //Null-Pointer

更新

随着问题更新为

I happen to have two instances of FileChooser but, I would like to call createAndShowGUI() only once

如果您只调用 createAndShowGUI() 一次,那么用户将只能 select 一次文件。

那么创建两个FileChooser实例有什么用呢?

每次创建 FileChooser 的新实例时都需要调用 createAndShowGUI()

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class FileChooser extends JFileChooser {
    private int result;
    private File filename;
    private File subFile;
    private FileNameExtensionFilter filter;

    public FileChooser() {
        filename = new File(System.getProperty("user.home"));
        filter = new FileNameExtensionFilter("Subtitle Files (*.srt)", "srt");
        this.setDialogTitle("Select a file");
        this.setCurrentDirectory(filename);       
        this.setFileFilter(filter);
        result = this.showOpenDialog(this);
        if(result == JFileChooser.APPROVE_OPTION) 
            subFile = this.getSelectedFile();   
        this.setVisible(true);
    }

    public File getFile() {
        return subFile;
    }

}