1

これが私が持っているコードです。

これは私のPrintToFileクラスです

import java.util.*;
import java.io.*;

public class PrintToFile{
        File f;
        FileWriter fw;
        PrintWriter pw;

    public void PrintToFile()throws Exception{//remove void from constructor
      File f = new File ("Output.txt");//dont reinitialize 
      FileWriter fw = new FileWriter(f, true);//dont reinitialize 
     PrintWriter pw = new PrintWriter(fw);//dont reinitialize 
   }

    public void printExp(ArrayList<Expense> expList){
        for(int i = 0; i < expList.size(); i++){
         pw.println("---------------------------------------");//exception here
         pw.println(expList.get(i));
      }
        pw.close();
    }
}

私のメインクラスでは、ここにArrayListを出力するための呼び出しがあります

    PrintToFile printer = new PrintToFile();
    printer.printExp(expList);   

expListをオブジェクトのArrayListとして定義しました

私が得る例外は

Exception in thread "main" java.lang.NullPointerException

マークされた場所で発生します。私の質問は、この例外の原因は何ですか?ありがとう

4

4 に答える 4

3

pwクラスフィールドであるオブジェクトを作成していませんがpw、メソッドに対してローカルであるオブジェクトを作成していますPrintToFile()。したがって、デフォルトPrintToFile.pwではnullであり、を取得しますNPE

メソッドを次または初期化に変更pwffwコンストラクターで(推奨):

public void PrintToFile() throws Exception {
      f = new File ("Output.txt");
      fw = new FileWriter(f, true);
      pw = new PrintWriter(fw);
}
于 2012-12-28T06:03:27.793 に答える
1

それ以外の:

File f = new File ("Output.txt");
FileWriter fw = new FileWriter(f, true);
PrintWriter pw = new PrintWriter(fw);

次のようにします。

f = new File ("Output.txt");
fw = new FileWriter(f, true);
pw = new PrintWriter(fw);

コンストラクターでローカル変数を再度宣言しています。インスタンス変数はデフォルト値 (null) で初期化されたままです。

于 2012-12-28T06:05:28.277 に答える
1

pw は、コンストラクターでグローバル変数として設定されていません。コンストラクターも修正してください。無効にしないでください。

import java.util.*;
import java.io.*;

public class PrintToFile
{
    File f;
    FileWriter fw;
    PrintWriter pw;

    public PrintToFile() throws Exception{
        f = new File ("Output.txt");
        fw = new FileWriter(f, true);
        pw = new PrintWriter(fw);
    }

    public void printExp(ArrayList<Expense> expList)
    {
        for(int i = 0; i < expList.size(); i++)
        {
            pw.println("---------------------------------------");//exception here
            pw.println(expList.get(i));
        }
        pw.close();
    }
}
于 2012-12-28T06:06:54.997 に答える
1

void を削除します (コンストラクターには void または戻り値の型がありません)。そして、変数を宣言するのは一度だけです。

import java.util.*;
import java.io.*;

public class PrintToFile
{
    File f;
    FileWriter fw;
    PrintWriter pw;

    public PrintToFile() throws Exception
    {
        f = new File ("Output.txt");
        fw = new FileWriter(f, true);
        pw = new PrintWriter(fw);
    }

    public void printExp(ArrayList<Expense> expList)
    {
        for(int i = 0; i < expList.size(); i++)
        {
            pw.println("---------------------------------------");
            pw.println(expList.get(i));
        }
        pw.close();
    }
}
于 2012-12-28T06:06:58.520 に答える