Java EOFException проблема ObjectInputStream - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь реализовать загрузку / сохранение для списка 'учетных записей' с помощью подхода, аналогичного тому, который был у меня успешно применен для HashMap.

Фон:

private List<Account> accounts;

public AccountManager() {
    try {
        accounts = LoadSave.loadAccounts();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Здесь я хочу настроить список своих учетных записей, включив в него сохраненные учетные записи.

Загрузить / сохранить реализацию:

public static void saveAccounts(List<Account> accounts) throws IOException {
    try {
        FileOutputStream fos = new FileOutputStream("accounts.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(accounts);
        oos.close();
        fos.close();
        System.out.printf("Saved account.");
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
}

public static List<Account> loadAccounts() throws IOException {
    List<Account> accounts = null;
    try {
        FileInputStream fis = new FileInputStream("accounts.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        accounts = (List<Account>) ois.readObject();
        ois.close();
        fis.close();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
    catch(ClassNotFoundException c) {
        System.out.println("Class not found");
        c.printStackTrace();
    }

    return accounts;
}

Проблема в том, что когда я инициализирую AccountManager в первый раз, в файле accounts.ser нет сохраненных учетных записей, поскольку эта функциональность реализована в более позднем методе, поэтому я получаю следующее исключение:

java.io.ObjectInputStream.java:862) в java.io.ObjectInputStream. (ObjectInputStream.java:358) в Impleatons.inventory_model.LoadSave.loadAccounts (LoadSave.java:69) в billing.AccountManager. (AccountManager.java:81) в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) в sun.reflect.DelegatingImpl..lang.reflect.Constructor.newInstance (Constructor.java:423) в java.lang.Class.newInstance (Class.java:442) в sun.reflect.misc.ReflectUtil.newInstance (ReflectUtil.java:51) в javafx.fxml.FXMLLoader $ ValueElement.processAttribute (FXMLLoader.java:927) по адресу javafx.fxml.FXMLLoader $ InstanceDeclarationElement.processAttribute (FXMLLoader.java:971) по адресу javafx.fxml.FavaMext.jpg: ElementFlex.jpg.fxml.FXMLLoader $ ValueElement.FXMLLoader.loadImpl (FXMLLoader.java:2441) в javafx.fxml.FXMLLoader.load (FXMLLoader.java:2409) в Implementat.inventory_model.InventoryCatalogue.seeAccounts (InventoryCatalogue.java:187) в sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) в sun.reflect.Amport.Imp62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в sun.reflect.misc.Trampoline.invoke (MethodUtil.java:) в sun.reflect.GeneratedMethodAccessor3.invoke (неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java.498)Ошибка..javafx.event.CompositeEventHandler.dispatchBubblingEvent (CompositeEventHandler.java:86) на com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent (EventHandlerManager.java:238) в com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent (EventHandlerManager.java:191) в com.sun.javafxiteisventEventв com.sun.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.java:58) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:11D.jp.(BasicEventDispatcher.java:56) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:114)в com.sun.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.java:56) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:11D.event.vent.vent.(BasicEventDispatcher.java:56) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:114) в com.sun.javafx.event.BasicEventDispatcher.dispatchEun .jj.jj (в BasicE).javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:114) в com.sun.javafx.event.EventUtil.fireEventImpl (EventUtil.java:74) в com.sun.javafx.event.Event: Event49) в javafx.event.Event.fireEvent (Event.java:198) в javafx.scene.Node.fireEvent (Node.java:8411) в javafx.scene.control.Button.fire (Button.java:185) вcom.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased (ButtonBehavior.java:182) в com.sun.javafx.scene.control.skin.BehaviorSkinBase $ 1.handle (ПоведениеSkinBas)e.java:96) на com.sun.javafx.scene.control.skin.BehaviorSkinBase $ 1.handle (BehaviorSkinBase.java:89) на com.sun.javafx.event.CompositeEventHandler $ NormalEventHandlerRecord.handleBubblingEvent: Combin) в com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent (CompositeEventHandler.java:80) в com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent (EventHandlerManager.java.sun.je.dispatchBubblingEvent (EventHandlerManager.java:191) по адресу com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent (CompositeEventDispatcher.java:59) по адресу com.sun.javafx.event.BasicEventDisjis58.ventisventischer.patis..javafx.: 114) на com.sun.javafx.56) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:114) в com.sun.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.javaIlha.jp..dispatchEvent (EventDispatchChainImpl.java:114) в com.sun.javafx.event.EventUtil.fireEventImpl (EventUtil.java:74) в com.sun.javafx.event.EventUtil.fireEvent (EventUtil.java:54) в javafx.event.Event.fireEvent (Event.java:198) в javafx.scene.Scene $ MouseHandler.process (Scene.java:3757) в javafx.scene.Scene $ MouseHandler.access $ 1500 (Scene.java:3485) в javafx.scene.Scene.impl_processMouseEvent (Scene.java:1762) в javafx.scene.Scene $ ScenePeerListener.mouseEvent (Scene.java:2494) в com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run (GlassViewEventHandler.java:394) в com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run (GlassViewEventHandler.java:295) в java.security.AccessControlged.sun.javafx.tk.quantum.GlassViewEventHandler.lambda $ handleMouseEvent $ 353 (GlassViewEventHandler.java:432) в com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock (QuantumToolkj.java.j)..quantum.GlassViewEventHandler.handleMouseEvent (GlassViewEventHandler.java:431) в com.sun.glass.ui.View.handleMouseEvent (View.java:555) в com.sun.glass.ui.View.notifyMouse (View.java:937).) на com.sun.glass.ui.win.WinApplication._runLoop (собственный метод)на com.sun.glass.ui.win.WinApplication.lambda $ null $ 147 (WinApplication.java:177) на java.lang.Thread.run (Thread.java:748)

I 'мы попытались установить учетную запись для нового ArrayList на обнаруженных исключениях EOFException, но он все еще вызывает исключение EOFException.Я хочу иметь возможность загружать учетные записи всякий раз, когда открываю окно диспетчера учетных записей, и поэтому мне нужно иметь возможность загружать учетные записи в конструкторе.

1 Ответ

0 голосов
/ 07 декабря 2018

Возможность загружать учетные записи, когда файл заполнен, или устанавливать учетные записи в пустой массив ArrayList, используя следующий код:

public static List<Account> loadAccounts() throws IOException {
    List<Account> accounts = null;
    try {
        File file = new File("accounts.ser");
        if (file.length() == 0) {
            accounts = new ArrayList<>();
        } else {
            FileInputStream fis = new FileInputStream("accounts.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            accounts = (List<Account>) ois.readObject();
            ois.close();
            fis.close();
        }
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
    catch(ClassNotFoundException c) {
        System.out.println("Class not found");
        c.printStackTrace();
    }
    return accounts;
}

Мне просто нужно было просто проверить длину файла и вернуть объекты, если он былненулевой и пустой ArrayList, если он был нулевым.

...