【问题标题】:Java create a class to print ArrayList to fileJava创建一个类来打印ArrayList到文件
【发布时间】:2012-12-28 06:01:42
【问题描述】:

这是我的代码。

这是我的 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

发生在标记的地方。我的问题是导致此异常的原因是什么?谢谢

【问题讨论】:

  • 谢谢大家!不确定是否反对?但是感谢所有答案,它现在可以完美运行
  • +1 也许有人在抱怨你的缩进风格;)
  • 您现在可能已经意识到,每当您“声明”一个变量(将数据类型 - 例如文件 - 放在变量前面)时,它都会创建一个新变量。因此,您有 2 个名为“f”的 File 类型的变量。当一个变量被声明时,它的范围被限制在它的大括号内。当括号退出时,变量超出范围。当变量名发生冲突时,最小的作用域获胜。因此,您在 PrintToFile() 构造函数中的“文件 f”掩盖了“文件 f”类变量。

标签: java class file-io printwriter


【解决方案1】:

您不是在创建 pw 的对象,它是类字段,但您正在创建 pw 的对象,它是方法 PrintToFile() 的本地对象。所以默认情况下PrintToFile.pw 为空,你会得到NPE

将您的方法更改为在构造函数中遵循或初始化pwffw(推荐):

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

【讨论】:

    【解决方案2】:

    代替:

    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)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        删除 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();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-01
          • 2020-08-16
          • 2015-05-05
          • 2017-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多