【问题标题】:Serialization, saving objects序列化,保存对象
【发布时间】:2016-11-24 08:24:39
【问题描述】:

我在将对象保存到文件时遇到了一些问题。我有类 FileManager,其中包含将对象保存到文件的方法。此方法用于包含主循环(选择不同选项)的类 Control。我想通过选择选项 EXIt 来保存对象,但没有任何反应。当我添加新选项(即 6 - 保存数据库)时,程序工作正常。如果有任何可能出错的线索,我将不胜感激。

class FileManager {
    package utils;

    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;

    import data.DataBase;

    public class FileManager {
      public static final String FILE_NAME = "file.txt";

      public void writeDataBaseToFile(DataBase db) {
        try (
                FileOutputStream fos = new FileOutputStream(FILE_NAME);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                ) {
            oos.writeObject(db);
        } catch (FileNotFoundException e) {
            System.err.println("Błąd");
        } catch (IOException e) {
            System.err.println("Błąd");
        }
    }
}

控制类:

class Control {
    package app;

    import data.DataBase;
    import data.Expense;
    import data.Income;
    import utils.AccountInfo;
    import utils.AddData;
    import utils.FileManager;
    import utils.Info;
    import utils.Options;

    public class Control {
    private AccountInfo account;
    private AddData addData;
    private DataBase dataBase;
    private Info inf;
    private Income income;
    private FileManager fileManager;

    public Control() {
        addData = new AddData();
        dataBase = new DataBase();
        inf = new Info(dataBase);
        account = new AccountInfo(dataBase);
        fileManager = new FileManager();
    }

    public void ControlLoop() {
        Options option;
        printOptions();
        while((option = Options.createOption(addData.getOption())) != Options.EXIT) {
            try {
                switch(option) {
                case ADD_INCOME:
                    addIncome();
                    break;
                case ADD_EXPENSE:
                    addExpense();
                    break;
                case PRINT_INCOME:
                    printIncome();
                    break;
                case PRINT_EXPENSE:
                    printExpense();
                    break;
                case RESUME_ACCOUNT:
                    resumeAccount();
                    break;
                case EXIT:
                    saveData();
                    }
            } catch(NullPointerException ex) {

            }
            printOptions();
        }
        addData.close();
    }

    public void addIncome() {
        income = addData.createIncome();
        dataBase.addBudget(income);
    }

    public void addExpense() {
        Expense expense = addData.createExpense();
        dataBase.addBudget(expense);
    }

    public void printIncome() {
        inf.printIncome();
    }

    public void printExpense() {
        inf.printExpense();
    }

    public void resumeAccount() {
        account.resumeIncome();
        account.resumeExpense();
    }

    public void saveData() {
        fileManager.writeDataBaseToFile(dataBase);
    }

    public void printOptions() {
        System.out.println("Wybierz opcję:");
        for(int i=0; i<6; i++) {
            System.out.println(Options.values()[i]);
        }
    }
}

【问题讨论】:

  • 尝试添加中断; EXIT案例后
  • 欢迎来到 Stack Overflow!看来您需要学习使用调试器。请帮助自己一些complementary debugging techniques。如果之后仍有问题,请随时回来提供更多详细信息。

标签: java


【解决方案1】:

您的代码永远无法到达 EXIT 案例。

因为当optionEXIT 时,它会终止循环。

while ((option=...) != Options.EXIT) {
    // execute loop body when option is not EXIT
    switch (option) {
    ...
    case Options.EXIT: // <-- it can simply not reach here. not ever.
        saveData();
}

尝试将 saveData() 移到 while 循环之外。

while (...) { // process options
}
// We are exiting, save data.
saveData();
addData.close();

附:您需要在 FileManager 中关闭输出流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2011-12-04
    • 1970-01-01
    • 2013-01-20
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多