【问题标题】:Java Trying to create a class to print ArrayList to FileJava尝试创建一个类以将ArrayList打印到文件
【发布时间】:2012-12-27 08:01:19
【问题描述】:

所以我有一个ArrayList 我想打印到文件的对象。我有一个PrintToFile 班级,在另一个班级我有一个ArrayList<Expenses> expList

这是我的 PrintToFile 类

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

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

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

这是我尝试在我的主类中调用该类

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

我遇到的第一个编译器错误出现在我的 PrintToFile 类中,它显示 PrintToFile.java:13: error: cannot find symbol,这是对 pw 的第一次调用

我试图弄清楚如何构建和构造类,以便并非所有内容都停留在我的主类的 main 方法中。所以本质上我正在尝试创建一个我可以随时调用来打印 ArrayList 的类。

所以我的问题是,如何构造PrintToFile 类,以便我的printExp 方法可以看到我创建的PrintWriter pw

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 为什么不将它们保存为 XML? XML 文件在出现时具有模糊的人类可读性,并且使用 XSLT 非常可读。将Expense 类变成一个bean,然后查看XMLDecoderXMLEncoder 来读/写整个ArrayList&lt;Expense&gt;。容易。

标签: java class serialization file-io printwriter


【解决方案1】:

由于pw 是方法PrintToFile 中的局部变量,因此另一个方法printExp 无法访问它。

局部变量 与对象在字段中存储其状态的方式类似,方法通常会将其临时状态存储在局部变量中。声明局部变量的语法类似于声明字段(例如,int count = 0;)。没有特殊关键字将变量指定为局部变量;该决定完全来自声明变量的位置——在方法的左大括号和右大括号之间。因此,局部变量只对声明它们的方法可见;其他班级无法访问它们。

请阅读Java Tutorial on Variables

【讨论】:

    【解决方案2】:

    PrintWriter 声明为类变量,然后在构造函数中对其进行初始化。这就是您的方法找不到变量pw 的原因。

    【讨论】:

      【解决方案3】:

      无法访问 pw 变量,因为它是在函数内部声明的,并且在类内部本地不可用。您必须执行以下操作

          import java.util.*;
          import java.io.*;
      
          public class PrintToFile{
               public PrintWriter pw; //<--declare it here
      
              public void PrintToFile()throws Exception{
                File f = new File ("Output.txt");
                FileWriter 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("---------------------------------------");//line 13
                   pw.println(expList.get(i));
                  }
                  pw.close();
              }
         }
      

      【讨论】:

        【解决方案4】:

        您在public void PrintToFile 方法的范围内定义了pw。它在public void printExp 方法中是不可见的。将PrintWriter pw = new PrintWriter(fw); 定义移动到类级别,使其成为成员,然后对所有类方法可见。

        下面应该会变魔术:

         public class PrintToFile{
             private File f = new File ("Output.txt");
             private FileWriter fw = new FileWriter(f, true);
             private PrintWriter pw = new PrintWriter(fw);
        
        
            public void PrintToFile(String outFileAbsolutePath)throws Exception{
                this.f = new File (outFileAbsolutePath);
                this.fw = new FileWriter(this.f, true);
                this.pw = new PrintWriter(this.fw);
            }
        
            public void printExp(ArrayList<Expense> expList){
               for(int i = 0; i < expList.size(); i++){
                 pw.println("---------------------------------------");//line 13
                 pw.println(expList.get(i));
               }
               pw.close();
           }
         }
        

        【讨论】:

          【解决方案5】:

          pw 必须是类级别的变量,目前作用域在方法内部,不能在方法外部访问。

          import java.util.*;
          import java.io.*;
              PrintWriter pw = null; // You need to declare it here
          public class PrintToFile{
              public void PrintToFile()throws Exception{
                File f = new File ("Output.txt");
                FileWriter fw = new FileWriter(f, true);
                pw = new PrintWriter(fw);
             }
          
              public void printExp(ArrayList<Expense> expList){
                  for(int i = 0; i < expList.size(); i++){
                        if(pw != null){ // need to check for null, as  it might be null
                            pw.println("---------------------------------------");//line 13
                            pw.println(expList.get(i));
                        }
          
                }
                  pw.close();
              }
          }
          

          声明为方法参数的变量可以从方法体中访问。可以从类中的任何位置访问类级变量。

          如果一个方法声明了一个与类级变量同名的局部变量,则前者将“遮蔽”后者。要从方法体内访问类级变量,请使用 this 关键字。

          关于变量作用域的更多详细信息,您可以查看this

          【讨论】:

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