FileReader读取文本文件时出错

问题描述:

我想将文本文件中的字符串存储在文本文件中并读取它。但我无法得到它的工作。我得到NullPointerError。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(); 

} 

} 

嗯,这是一个摆动程序的一部分。我正在尝试使用文本文件作为小型数据库。

+0

哪一个是第41行? – Tudor 2012-04-14 17:02:39

+0

嗯,在你分享的栈跟踪和你的代码之间存在非常奇怪的差异:栈跟踪不包括'checkFile'的调用,只是直接调用'readFile'。你确定你分享最新的堆栈跟踪和代码吗? – 2012-04-14 17:03:04

+0

你的错误不会发生在这段代码中。你一定错过了一些东西。也许重新编译? – 2012-04-14 17:03:52

线41是这样的:

FileReader reader = new FileReader(dataFile); 

所以我敢打赌,dataFile为空在这里。

但是,您似乎在调用此方法之前初始化它,否则将引发checkFile内部的异常。

您确定您不直接致电readFile某处,而无需先致电checkFile?在任何情况下,这种模式都不是推荐的方法,因为您要求班级的用户以特定的顺序调用方法。

从堆栈跟踪看来,您似乎直接从main调用readfile()而不是通过checkfile()。所以dataFile是空的,因为它没有被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); 
}