2016-11-23 15 views
0

オブジェクトをファイルに保存する際に問題があります。オブジェクトをファイルに保存するメソッドを含む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]); 
     } 
    } 
} 
+0

休憩を追加してみてください。 EXITの後に – maxTrialfire

+0

ようこそスタックオーバーフロー!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

答えて

0

あなたのコードは、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(); 
} 

whileループの外saveData()を移動してみます。

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

P.S. FileManagerで出力ストリームを閉じる必要があります。

関連する問題