-2

残高や所有者名などの変数を持つ単純な銀行口座を処理するための非常に単純な GUI をユーザーに提供する単純な銀行プログラムを作成しています。プログラムは 1 つの銀行口座からのみ実行されるため、プログラムが起動するたびにアカウント (オブジェクト) が逆シリアル化されます。ここで問題が発生します。アカウント オブジェクトが逆シリアル化されるたびに、 になりnullます。これを探して検索してみましたが、空の結果しか出てきませんでした。これを防ぐにはどうすればよいですか?これは思ったよりも簡単に解決できる問題だと思いますが、なぜそれが起こっているのかわかりません。accountオブジェクトがアカウントとして返されないのはなぜですか? 以下に両方のクラスを投稿します...

BankGUI クラス:

package GUIs;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;

public class BankGUI implements Serializable {

    BankAccount account;
    static BankGUI gui;

    private void deserializeAccount() {
        try {
            ObjectInputStream objectStream2 = new ObjectInputStream(
                    new FileInputStream("bankAccounts.txt"));
            Object acc = objectStream2.readObject();
            account = (BankAccount) acc;
            System.out.println("yes");
            objectStream2.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Nope.");
        }
    }

    private void checkForNull() {
        if (account == null) {
            System.out.println("It's been nullified.");
        } else {
            System.out.println("It worked.");
        }
    }
    public static void main(String[] args) {
        System.out.println("");
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        gui = new BankGUI();
        gui.deserializeAccount();
        gui.checkForNull();
        gui.displayGUI();
    }

    // all global components for JFrame
    JTextArea statusArea;
    JCheckBox isLockedCheckBox;
    JList depositAmount;
    JList withdrawAmount;
    JButton depositButton;
    JButton withdrawButton;
    JButton saveAccountButton;

    private void displayGUI() {
        JFrame frame = new JFrame("Virtual Bank v3.3");

        Integer[] intList = { 1, 2, 5, 10, 20, 50 };

        JPanel rightPanel = new JPanel();
        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
        rightPanel.setBackground(Color.GREEN);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.GREEN);
        centerPanel.setLayout(new GridBagLayout());

        frame.add(BorderLayout.CENTER, centerPanel);
        frame.add(BorderLayout.EAST, rightPanel);

        // add some JLabel's
        JLabel depositAmountLabel = new JLabel("Deposit Amount:");
        JLabel withdrawAmountLabel = new JLabel("Withdraw Amount:");
        JLabel isLockedLabel = new JLabel("Lock account(True/False)");

        // finish components(center panel)
        statusArea = new JTextArea(25, 25);
        statusArea.setEditable(false);

        centerPanel.add(statusArea);

        // add this to panel
        isLockedCheckBox = new JCheckBox();
        // add this to panel

        // scrollers and Jlists
        // ***********************************************************************
        depositAmount = new JList(intList);
        JScrollPane scroller1 = new JScrollPane(depositAmount);
        scroller1
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller1
                .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        depositAmount.setVisibleRowCount(1);
        depositAmount.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        withdrawAmount = new JList(intList);
        JScrollPane scroller2 = new JScrollPane(depositAmount);
        scroller2
                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller2
                .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        depositAmount.setVisibleRowCount(1);
        depositAmount.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        // ***********************************************************************

        depositButton = new JButton("Deposit Amount.");
        withdrawButton = new JButton("Withdraw Amount");
        saveAccountButton = new JButton("Save your Account");

        rightPanel.add(depositAmount);
        rightPanel.add(depositButton);

        frame.setSize(425, 650);
        frame.setVisible(true);
    }

    private void serializeAccount() {
        try {
            ObjectOutputStream objectStream1 = new ObjectOutputStream(
                    new FileOutputStream("bankAccounts.txt"));
            objectStream1.writeObject(account);
            objectStream1.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

BankAccount クラス:

package GUIs;

import java.io.Serializable;

public class BankAccount implements Serializable {

    private static final long serialVersionUID = -5341449653011848470L;

    int balance = 0;
    int userWallet = 0;
    String owner = "Foo Bar";

    String status = "Account Owner: " + owner + "\nAccount balance: $"
            + balance + "\nOwner Wallet Balance: $" + userWallet;
    boolean isLocked = false;

    public int withdraw(int amount) {
        balance -= amount;
        userWallet += amount;
        return userWallet;
    }

    public int deposit(int amount) {
        balance += amount;
        userWallet -= amount;
        return balance;
    }

    public int depositCashIntoWallet(int amount) {
        userWallet += amount;
        return userWallet;
    }

}
4

1 に答える 1

1

この質問は、おそらく重複としてクローズされます。

それまでに、次の小さなアプリケーションを実行して、銀行口座の詳細ファイルを書き換えます。

public class WriteBankDetails {

   public static void main(String[] args) throws IOException {
     ObjectOutputStream objectStream1 = 
                new ObjectOutputStream(new FileOutputStream("bankAccounts.txt"));
        objectStream1.writeObject(new BankAccount());
        objectStream1.close();

    }
}

これにより、ファイルが破損しておらず、以前のバージョンのBankAccount. 次に、Swing アプリケーションを再実行します。

于 2013-05-01T02:31:27.893 に答える