2012-04-14 22 views
0

배열의 문자열을 텍스트 파일에 저장하고 읽으려고합니다. 그러나 나는 그것을 작동시킬 수 없다. 나는 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

+0

흠 당신이 공유하는 스택 트레이스와 코드 사이에 이상한 불일치가 있습니다. 스택 추적은'checkFile' 호출을 포함하지 않고 바로'readFile' 호출을 포함합니다. 가장 최근의 스택 트레이스와 코드를 공유 하시겠습니까? –

+0

이 코드에서는 오류가 발생하지 않습니다. 당신은 뭔가를 놓치고 있어야합니다. 어쩌면 다시 컴파일할까요? –

답변

0

라인 (41)은 이것이다 :

FileReader reader = new FileReader(dataFile); 

은 그래서 dataFile 여기에 널 (null)입니다 내기 것입니다.

그러나이 메서드를 호출하기 전에이를 초기화하는 것처럼 보이지 않으면 예외가 checkFile 안에 발생합니다.

을 먼저 호출하지 않고 readFile을 직접 호출하지 않으시겠습니까? 어떤 경우이든이 패턴은 권장되는 방법이 아닙니다. 클래스 사용자가 특정 순서로 메소드를 호출해야하기 때문입니다.

0

스택 추적에서 checkfile() 대신 main에서 직접 readfile()을 호출 한 것처럼 보입니다. 그래서 checkfile에 의해 초기화되지 않기 때문에 dataFile은 null입니다. 또한 스택 추적 및 주어진 코드가 일치하지 않습니다. FileReader 생성자가 null 인수로 호출되면 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); 
} 
관련 문제