2012-04-14 13 views
0

Ich versuche, Array-String in einer Textdatei zu speichern und zu lesen. Aber ich kann es nicht funktionieren. Ich bekomme NullPointerError.FileReader Fehler beim Lesen einer Textdatei

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) 

Hier sind zwei Klassen.

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

} 

Und Hauptklasse

package in.isuru.justconverter; 

public class Test {

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

} 

} 

Gut, das ist ein Teil eines Swing-Programm. Ich versuche Textdatei als kleine Datenbank zu verwenden.

+0

Welches ist Linie 41? – Tudor

+0

Hmm, es gibt eine sehr seltsame Diskrepanz zwischen dem StackTrace, den Sie teilen, und Ihrem Code: Der Stack-Trace enthält nicht den Aufruf von 'checkFile', sondern nur den Aufruf von' readFile'. Sind Sie sicher, dass Sie den neuesten Stack-Trace und -Code gemeinsam nutzen? –

+0

Ihr Fehler kann nicht mit diesem Code passieren. Du musst etwas verpassen. Vielleicht neu kompilieren? –

Antwort

0

Zeile 41, ist dies:

FileReader reader = new FileReader(dataFile); 

so würde ich wetten, dass dataFile hier null ist.

Sie scheinen es jedoch zu initialisieren, bevor Sie diese Methode aufrufen, andernfalls würde die Ausnahme in checkFile geworfen werden.

Sind Sie sicher, dass Sie nicht zuerst readFile anrufen, ohne zuerst checkFile zu rufen? In jedem Fall ist dieses Muster kein empfohlener Ansatz, da die Benutzer Ihrer Klasse Methoden in einer bestimmten Reihenfolge aufrufen müssen.

0

Von der Stack-Ablaufverfolgung scheint es so, als hätten Sie readfile() direkt von main anstatt von checkfile() aufgerufen. Daher ist dataFile null, da es nicht von checkfile initialisiert wird. Auch der Stack-Trace und der angegebene Code stimmen nicht überein. Wenn der FileReader-Konstruktor mit einem Null-Argument aufgerufen wird, wird die NullPointerException ausgelöst, wenn der FileInputstream-Konstruktor erreicht wird. Hier ist der Code von jdk Quelle:

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); 
} 
Verwandte Themen