1

配列の文字列をテキストファイルに保存して読み取ろうとしています。しかし、私はそれを機能させることができません。NullPointerError が発生しています。

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)

ここに2つのクラスがあります。

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

}

}

これはスイングプログラムの一部です。テキスト ファイルを小さなデータベースとして使用しようとしています。

4

2 に答える 2

0

41行目は次のとおりです。

FileReader reader = new FileReader(dataFile);

だから私dataFileはここでヌルを賭けるだろう。

ただし、このメソッドを呼び出す前に初期化するようです。そうしないと、内部で例外がスローされcheckFileます。

readFile最初に電話をかけずに、どこかに直接電話をかけていませんcheckFileか?いずれの場合も、クラスのユーザーが特定の順序でメソッドを呼び出す必要があるため、このパターンは推奨されるアプローチではありません。

于 2012-04-14T17:01:25.267 に答える
0

スタック トレースから、 checkfile() ではなく main から直接 readfile() を呼び出したようです。したがって、 dataFile は checkfile によって初期化されていないため 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);
}
于 2012-04-14T17:14:37.793 に答える