扫描文本文件并将其存储在数组列表中会产生空指针异常



嗨,我正在尝试读取从文本框中获取的文本文件并在不同的类中读取它。我的第一个类 Gui 应该输出该文本文件,但给了我一个错误。

public class Gui {
private static JFrame frame;
private static JToolBar toolbar;
private static JTextField input;
private static JTextArea output;
private static JScrollPane scrollPane;
private static JButton read, clear;
public static ArrayList<String> Lines;
private static final int HOR_SIZE = 400;
private static final int VER_SIZE = 150;
public static reader reader = new reader();
private static File file;
private static ArrayList<String> temp = new ArrayList<>();
public static void initComponents(){
    frame = new JFrame("CS-371 - File Reader");
    frame.setSize(400, 400);
    toolbar = new JToolBar();
    input = new JTextField();
    read = new JButton("Read File");
    clear = new JButton("Clear");
    output = new JTextArea();
    output.setSize(HOR_SIZE, VER_SIZE);
    //output.setEditable(false);
    scrollPane = new JScrollPane(output);           
    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scrollPane.setMaximumSize(new java.awt.Dimension(HOR_SIZE, VER_SIZE));
    scrollPane.setMinimumSize(new java.awt.Dimension(HOR_SIZE, VER_SIZE));
    scrollPane.setPreferredSize(new java.awt.Dimension(HOR_SIZE, VER_SIZE));

    toolbar.add(input);
    toolbar.add(read);
    frame.add(scrollPane, BorderLayout.CENTER );
    frame.add(toolbar,BorderLayout.NORTH);
    frame.add(clear, BorderLayout.SOUTH);
    toolbar.setFloatable(false);
    frame.setVisible(true);
}
public static void main(String[] args){
    initComponents();
    read.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            reader.setPath(input.getText());
            file = new File(input.getText());
            if(!file.isFile()){
                output.setText(reader.checkPath()); 
            }else{
                temp = reader.getFile();
                if(!temp.isEmpty()){
                    for(int i = 0; i < temp.size(); i++){
                        output.setText(temp.get(i).toString()); 
                    }
                }else{
                    output.setText("File empty");
                }
            }
        }
    }); 
    clear.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            output.setText("");
        }
    });
}
}

在 temp = reader.getFile() 行,这是一个设置的数组列表,它从我的阅读器类中的方法获取其内容。

public class reader implements Runnable {
     private Scanner scanner;
     private File file;
     private String path;
     private ArrayList<String> fileContents;
public String getLine(){
    return null;
}
public void setPath(String path){
        this.path = path;
}
public String checkPath(){
    file = new File(path);
    if(file.isFile()){
    }else{
        return "File not found";
    }
    return "";
}
public ArrayList<String> getFile(){
    file = new File(path);
    try {
        scanner = new Scanner(file);
        String scan = scanner.nextLine();
        fileContents.add(scan);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return fileContents;
}
@Override
public void run() {

}
}

我从这个类得到的错误是fileContent.add(scan)两者都显然给出了空指针异常,但我不知道为什么原因应该填充我的数组列表,然后另一个数组列表在将其内容设置为它调用的返回数组列表时应该没有问题

您应该首先初始化fileContents,如下所示:

private ArrayList<String> fileContents = new ArrayList<String>();

否则默认null

您需要初始化您的ArrayList。也就是说,在某个时候实际创建它

您可以直接在其声明上执行此操作,如下所示:

private final List<String> fileContents = new ArrayList<String>();

或使用构造函数

public reader() {
    this.fileContents = new ArrayList<String>();
}

附带说明一下,Java 中的约定是将类名大写。因此,您的reader类可以(应该?)称为Reader
实际上,我还建议您尽可能避免为您的类使用此标识符,因为 Java 标准库中已经存在具有相同名称的接口

...
private ArrayList<String> fileContents = new ArrayList<>();
...

相关内容

  • 没有找到相关文章

最新更新