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

时间:2014-04-03 11:47:28

标签: java arrays file filereader

您好我正在尝试阅读一个文本文件,我从一个文本框中获取并在另一个类中阅读它。我应该输出该文本文件的第一个类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() {


}
}

我从这个类中得到的错误是fileContents.add(scan) 两者显然都提供空指针异常,但我不知道为什么原因应该填充我的数组列表然后其他数组列表应该没有麻烦将其内容设置为它调用的返回数组列表

3 个答案:

答案 0 :(得分:0)

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

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

否则默认为null

答案 1 :(得分:0)

您需要初始化您的ArrayList。也就是说,实际上创建它

你可以直接在声明中这样做:

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

或使用构造函数

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

另一方面,Java中的约定是大写类名。因此,您的reader课程可以(应该?)被称为Reader 实际上,我还建议您尽量避免在您的类中使用此标识符,因为Java标准库中已存在同名的接口

答案 2 :(得分:0)

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