【问题标题】:NullPointerException while calling getter JFileChooser调用 getter JFileChooser 时出现 NullPointerException
【发布时间】:2015-07-02 19:14:54
【问题描述】:

每次调用 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 在这种情况下。这是sn-p:

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

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

【问题讨论】:

  • 您应该也应该在构造函数中初始化 subFile。
  • @wazaaaap 我该怎么做?
  • 只需将“createAndShowGUI”中的代码剪切并粘贴到构造函数中即可。现在您不需要调用该函数,它应该可以正常工作。
  • 将它作为参数传递给构造函数并初始化它。 (用于更新)
  • @wazaaaap 你就是男人

标签: java nullpointerexception getter jfilechooser


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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;
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      根据您的代码,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
      

      更新

      随着问题的更新

      我碰巧有两个 FileChooser 实例,但我想只调用一次 createAndShowGUI()

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

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

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

      【讨论】:

      • 我在调用getFile()之前在main函数中调用了@
      • 创建FileChooser的实例后需要调用createAndShowGUI()
      • 我在答案中添加了一个代码 sn-p。这应该可以解决目的。
      【解决方案4】:

      我认为这是个问题:

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

      result == JFileChooser.APPROVE_OPTION 返回 false 并且 subFile 从未初始化

      【讨论】:

        猜你喜欢
        • 2013-12-29
        • 2015-02-13
        • 2012-01-21
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        相关资源
        最近更新 更多