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.

将您的方法更改为 follow 或 initialize 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 回答