Java writeout程序未处理的异常类型IOException

时间:2012-11-30 21:25:14

标签: java methods ioexception throws

我的程序的这部分得到了多个错误。它基本上是从无组织文件PersonnelInfo.txt中读取输入,并将其分类到EmployeeInfo类中的数组(未发布,因为我不相信问题在于该类,如果你们想要,我会发布以供参考)。

在对信息(如姓名,身份证号码,公司名称等)进行排序后,程序会将此信息写入另一个文件ORGANIZEDPersonnelInfo.txt,该文件将按如下方式排序:

名称:此处的员工姓名

ID:此处的员工ID

我得到的一个错误是在“静态FileWriter writeOut ...”行中,它是“未处理的异常类型IOException。我在主方法声明中抛出了IOException但它没有做任何事。”

接下来,在“public String toString()”方法中,我收到了多个错误。当我试图使其无效时,它表示返回类型与Object.toString()不兼容。当我将它保存为String并返回null时,它希望我使用try / catch但主要错误仍然存​​在。

请帮忙!这变得非常令人沮丧...

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

public class HR {

static EmployeeInfo[] employee = new EmployeeInfo[4];
static FileWriter writeOut = new FileWriter("/Users/zach/Documents/workspace/Dec. 10, 2012/src/ORAGNIZEDPersonnelInfo.txt");
static BufferedWriter out = new BufferedWriter(writeOut);


public static void main(String[] args) throws IOException {
    File PersonnelInfo = new File("/Users/zach/Documents/workspace/Dec. 10, 2012/src/PersonnelInfo.txt");
    Scanner inputFile = new Scanner(PersonnelInfo);

    int numOfEmployees = Integer.parseInt(inputFile.nextLine());
    System.out.println("Number of employees: " + numOfEmployees);



    for (int i = 0; i < 4; i++) {
        String name = inputFile.nextLine();
        String ID = inputFile.nextLine();
        String title= inputFile.nextLine();
        String startDate = inputFile.nextLine();
        employee[i] = new EmployeeInfo(name, ID, title, startDate);
    }

    listEmployeeInfo();
    employee.toString();

}


public String toString() {
    for (EmployeeInfo i: employee) {
        out.write("Name: " + i.getName());
        out.write("ID: " + i.getID());
        out.write("Title: " + i.getTitle());
        out.write("Start Date: " + i.getStartDate());
    }
    return null;
}

5 个答案:

答案 0 :(得分:0)

更正了toString()

public String toString() {
    StringBuffer buf = new StringBuffer();
    for (EmployeeInfo i: employee) {
        buf.append("Name: ").append(i.getName());
        buf.append("ID: ").append(i.getID());
        // ....
    }
    return buf.toString();
}

在main中打印内容:

HR hr = new HR();
out.write(hr.toString());

但我会用自己的写方法“writeEmployees(out)”编写 见海报JB Nizet的解决方案

答案 1 :(得分:0)

如果你覆盖toString()(就像你正在做的那样,因为toSTring()是一个来自Object的方法,而你在类中重新定义它,它会像所有类一样扩展Object),你应该尊重重写方法的契约,即返回对象的String表示形式(而不是将字段写入缓冲的writer。将此方法命名为另一个名称。

此外,您正在调用一个抛出已检查异常的方法(out.write()):IOException。所以,要么你知道如何处理这个异常,你应该抓住它,或者你不知道如何处理它,并且该方法应该声明它抛出异常:

public void writeToOut() throws IOException {
    for (EmployeeInfo i: employee) {
        out.write("Name: " + i.getName());
        out.write("ID: " + i.getID());
        out.write("Title: " + i.getTitle());
        out.write("Start Date: " + i.getStartDate());
    }
}

您的程序中还有其他编译错误。每个都附带一条错误消息,一个文件名和一个行号。尝试理解该消息,并修复错误。阅读Java tutorial about exceptions以了解如何处理它们。

如果在阅读本教程后仍然无法处理它们,请提出另一个问题并粘贴从编译器获得的确切错误消息。

答案 2 :(得分:0)

我建议在你的main中移动你的Writer静态声明有两个原因(一个是他们不需要是一个静态属性,而且还在那里处理IOException)。从toString获取字符串并使用writer在文件中写入字符串:

  public class HR {

    static EmployeeInfo[] employee = new EmployeeInfo[4];


    public static void main(String[] args) throws IOException {
         FileWriter writeOut = 
                    new FileWriter("/Users/zach/Documents/workspace/"+
                                   "Dec. 10, 2012/src/ORAGNIZEDPersonnelInfo.txt");
         BufferedWriter out = new BufferedWriter(writeOut);

         File PersonnelInfo = new File("/Users/zach/Documents/workspace/"+
                                       "Dec. 10, 2012/src/PersonnelInfo.txt");
         Scanner inputFile = new Scanner(PersonnelInfo);

         ....
         //write employee string in the file
         out.write(getEmployeeString());
         out.close();
    }

    public String getEmployeeString() {
     StringBuilder stringBuilder = new StringBuilder();
     for (EmployeeInfo i: employee) {
          stringBuilder.append("Name: " + i.getName());
          stringBuilder.append("ID: " + i.getID());
          stringBuilder.append("Title: " + i.getTitle());
          stringBuilder.append("Start Date: " + i.getStartDate());
     }
     return stringBuilder.toString();
   }       
 }

如果你必须将它们作为静态变量,那么在静态块中进行初始化,并进行异常处理,如下所示:

     static FileWriter writeOut;
     static BufferedWriter out;

     static {
        try{
           writeOut = 
                    new FileWriter("/Users/zach/Documents/workspace/"+
                                   "Dec. 10, 2012/src/ORAGNIZEDPersonnelInfo.txt");
              out = new BufferedWriter(writeOut);
         }catch(IOException ioex){
               ioex.printStackTrace();
         }
     } 

答案 3 :(得分:0)

当您执行static void main时,您不在类HR的实例中,而是在静态方法中。因此,如果您想使用您编写的toString()方法,则必须执行new HR().toString()

最好从所有字段中删除static关键字并创建HR对象的实例,然后在该对象的构造函数中打开该文件,即

public HR() {
  try {
    this.writeOut = new FileWriter("/Users/zach/Documents/workspace/Dec. 10, 2012/src/ORAGNIZEDPersonnelInfo.txt");
  } catch (IOException e) {
     // handle it, etc.
  }
}

public void processFile() {
  // Do the stuff
}

public static void main(String[] args) {
  HR myHR = new HR().processFile();
  // etc.
}

这将允许您使用toString()方法,并允许您按照您希望的方式处理异常。

答案 4 :(得分:0)

其他人有地址toString(),所以我会去FileWriter ...

我会在方法而不是静态范围中填充writeOut,这样您就可以捕获异常甚至尝试使用不同的文件名或其他内容:

FileWriter openOutputfile(String name)
{
    boolean done = false;
    FileWriter result = null
    try {
        result = new FileWriter(...);
        done = true;
    }
    catch(IOException ex) {
        // print the stack trace
        // prompt for another filename
        // name = read line
    }
    return result;
}