有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

读取文本文件时出现java FileReader错误

我试图将数组字符串存储在文本文件中并读取它。但我不能让它工作。我得到了空指针错误

Exception in thread "main" java.lang.NullPointerException
   at java.io.FileInputStream.<init>(Unknown Source)
   at java.io.FileReader.<init>(Unknown Source)
   at in.isuru.justconverter.FileDbTool.readFile(FileDbTool.java:41)
   at in.isuru.justconverter.Test.main(Test.java:10)

这里有两门课

package in.isuru.justconverter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

public class FileDbTool {

File dataFile;
ArrayList<String> filePath;

public void checkFile(){
    dataFile = new File("db.txt");
    if(dataFile.exists()){
        readFile();
    }else{
        try {
            dataFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Coudn't Create New File!");
            System.exit(1);
        }
    }
}

public void readFile(){

    int len;
    try{
        char[] chr = new char[4096];
        StringBuffer buffer = new StringBuffer();
        FileReader reader = new FileReader(dataFile);
        try {
            while ((len = reader.read(chr)) > 0) {
                buffer.append(chr, 0, len);
            }
          }finally {
             reader.close();
          }
        System.out.println(buffer.toString());
        StringTokenizer st = new StringTokenizer(buffer.toString(), ",");
        while (st.hasMoreTokens()) {
            String value = st.nextToken();
            filePath = null;
            filePath = new ArrayList<String>();
            filePath.add(value);
        }

    }catch(IOException e){
        JOptionPane.showMessageDialog(null, "Read Error");
    }
}

public String[] getFilePathArray(){
    readFile();
    return filePath.toArray(new String[filePath.size()]);
}

public File[] getFiles(){
    String[] paths = getFilePathArray();
    ArrayList<File> files = new ArrayList<File>();
    for(int i = 0; i < paths.length; i++){

        File file = new File(paths[i]);
        files.add(file);
    }

    return files.toArray(new File[files.size()]);
}

public void eraseFile(){
    dataFile.delete();
}

public void writeFile(String[] stuff){
    try{
        BufferedWriter out = new BufferedWriter(new FileWriter(dataFile, true));
        out.append(stuff + ",");
    }catch(IOException e){

    }
}

public void writeToDb(String[] array){
    writeFile(array);
}

}

和主类

package in.isuru.justconverter;

公开课考试{

/**
 * @param args
 */
public static void main(String[] args) {
    FileDbTool app = new FileDbTool();
    app.checkFile();

}

}

这是swing程序的一部分。我试图使用文本文件作为一个小数据库


共 (2) 个答案

  1. # 1 楼答案

    从堆栈跟踪来看,您似乎是直接从main而不是通过checkfile()调用readfile()。所以数据文件是空的,因为它不是由checkfile初始化的。堆栈跟踪和给定代码也不匹配。当使用null参数调用FileReader构造函数时,它将在到达FileInputstream构造函数时抛出NullPointerException。 以下是来自jdk源代码的代码:

        public FileInputStream(File file) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(name);
    }
        if (name == null) {
            throw new NullPointerException();
        }
    fd = new FileDescriptor();
        fd.incrementAndGetUseCount();
    open(name);
    }
    
  2. # 2 楼答案

    第41行是这样的:

    FileReader reader = new FileReader(dataFile);
    

    所以我打赌dataFile在这里是空的

    但是,您似乎在调用此方法之前对其进行了初始化,否则将在checkFile内引发异常

    您确定没有先调用checkFile而直接在某处调用readFile吗?无论如何,这种模式都不是推荐的方法,因为您需要类的用户按特定顺序调用方法