2012-11-30 3 views
0

Я получаю несколько эррос с этой частью моей программы. В основном это чтение ввода из неорганизованного файла PersonnelInfo.txt, и он сортирует его в массив в классе EmployeeInfo (не публикуется, потому что я не верю, что проблема лежит в этом классе, если вы, ребята, хотите, я отправьте его для справки).Программа Java writeout Необработанный тип исключения IOException

После сортировки информации (например, имя, идентификационный номер, название в компании и т.д.), программа записывает это в другой файл, ORGANIZEDPersonnelInfo.txt, которые будут рассортированы как таковой:

Имя: Имя сотрудника здесь

ID:. Employee ID здесь

т.д.

Одна ошибки я получаю в «статическом FileWriter writeOut ...» линия, и это «типа Необработанного исключения IOException я положил броски IOException в основном методе d но ничего не делал.

Далее, в методе «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; 
} 

ответ

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

в основной печати содержание:

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

Но я хотел бы написать, используя собственный метод записи " writeEmployees (out) " см. Решение плаката JB Nizet

+0

Он пишет в файл, но я получаю [LEmployeeInfo; @ 18872380 я тоже выбрал бы непосредственно записать в файл, но для этого проекта нам нужно использовать метод. – Zach

+0

Hr hr = new Hr(); out.write (hr.toString()); – AlexWien

+0

Но теперь это становится немного уродливым. – AlexWien

0

Если вы переопределяете toString() (как вы это делаете, поскольку toSTring() - это метод из Object, и вы переопределяете его в своем классе, который расширяет Object, как это делают все классы), вы должны соблюдать контракт переопределенного метода, который возвращает строковое представление объекта (и не писать поля буферизованной записи. Назовите этот метод другим именем.

Кроме того, вы вызываете метод (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, чтобы понять, как с ними справиться.

Если вы все еще не можете обработать их после прочтения этого урока, задайте другой вопрос и вставьте точное сообщение об ошибке, которое вы получаете от компилятора.

0

Я бы посоветовал переместить статическую декларацию Writer внутри вашей основной причины по двум причинам (один из них не обязательно должен быть статическими атрибутами, а также обрабатывается IOException).Получить строку из toString и использовать писатель, чтобы написать строку в файле:

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

Спасибо тонну, это решение получает программу, записывающую файл, но теперь она пишет [LEmployeeInfo; @ 39617189, поэтому мне нужно выяснить, что происходит. – Zach

+0

@ Zach Простая ошибка с моей стороны. Вместо 'out.write (employee.String());' (который вызывает метод toString для класса employee), он должен быть просто 'out.write (toString());', но это выглядит не так, поэтому я рекомендуется изменить имя метода с 'toString()' на 'getEmployeeString()' и использовать 'out.write (getEmployeeString());'. Я обновил ответ. –

0

Когда вы выполняете static void main, вы не находитесь в экземпляре класса HR, а скорее в его статическом методе. Так что если вы хотите использовать toString() метод, который вы написали, вы должны были бы сделать new HR().toString()

Вы бы лучше удаления статического ключевого слова из всех полей и создания экземпляра 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() и позволяют обрабатывать исключение так, как вы хотите.

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; 
} 
Смежные вопросы