2015-07-02 2 views
0

Я получаю исключение NullPointerException каждый раз, когда я вызываю getter. Вот код:NullPointerException при вызове getter JFileChooser

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 

UPDATE: я, случается, есть два экземпляра FileChooser, но я хотел бы назвать createAndShowGUI() только один раз. Как инициализировать выбранный файл в конструкторе?

+1

Возможно, вы также должны инициализировать subFile в конструкторе. – Wazaaaap

+0

@wazaaaap Как мне это сделать? – Jimmy

+0

Просто вырежьте код в «createAndShowGUI» и вставьте его в конструктор. Теперь вам не нужно вызывать функцию, и она должна работать нормально. – Wazaaaap

ответ

1
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; 
    } 

} 
2

Ну, вы никогда не звоните createAndShowGUI(). Просто позвони, что перед вызовом getFile()

0

Я думаю, что это проблема:

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

result == JFileChooser.APPROVE_OPTION возвращение ложным и subFile никогда не инициализируется

1

В соответствии с вашим кодом, поле subFile инициализируется в методе createAndShowGUI() внутри if condition.

Но, как вы не вызывая метод createAndShowGUI() поле subFile остается null при вызове getFile().

Попробуйте этот код,

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 

UPDATE

Поскольку вопрос обновляется с

Я посчастливилось иметь два экземпляра FileChooser, но я хотел бы назвать createAndShowGUI() только один раз

Если вы вызываете createAndShowGUI() только один раз, пользователь сможет выбрать файл только один раз.

Тогда зачем использовать два экземпляра FileChooser?

Вы должны позвонить createAndShowGUI() каждый раз, когда вы создаете новый экземпляр FileChooser.

+0

Я вызываю его в основной функции перед вызовом 'getFile()' – Jimmy

+0

Вам нужно вызвать 'createAndShowGUI()' после создания экземпляра 'FileChooser'. –

+0

Я добавил фрагмент кода к моему ответу. Это должно решить эту задачу. –

Смежные вопросы