为什么这个Java程序抛出NullPointerException?

为什么这个Java程序抛出NullPointerException?,java,swing,user-interface,nullpointerexception,Java,Swing,User Interface,Nullpointerexception,在这个程序中,我需要我的程序将一个类的状态放入一个不可编辑的JTextArea中,但我一直得到一个NullPointerException。我觉得这与对象每次启动时都被反序列化有关。如果我删除它并用实际的字符串替换它,它就可以正常工作。我该怎么办?我将在下面发布这两个类 BankGUI类: package GUIs; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagLayout; impor

在这个程序中,我需要我的程序将一个类的状态放入一个不可编辑的JTextArea中,但我一直得到一个NullPointerException。我觉得这与对象每次启动时都被反序列化有关。如果我删除它并用实际的字符串替换它,它就可以正常工作。我该怎么办?我将在下面发布这两个类

BankGUI类:

package GUIs;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

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 {

    BankAccount account;

    private void deserializeAccount() {
        try {
            ObjectInputStream objectStream2 = new ObjectInputStream(
                    new FileInputStream("bankAccounts.txt"));
            account = (BankAccount) objectStream2.readObject();
            objectStream2.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println("");
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        BankGUI gui = new BankGUI();
        gui.deserializeAccount();
        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);
        statusArea.setText(account.status);

        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 (IOException e) {
            e.printStackTrace();
        }
    }

}
银行账户类别:

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

}
以下是堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at GUIs.BankGUI.displayGUI(BankGUI.java:85)
    at GUIs.BankGUI.main(BankGUI.java:49)

堆栈跟踪几乎可以准确地告诉您问题所在。在BankGUI类的第85行有一个
NullPointerException
。如果我的IDE是正确的,那么第85行是这一行吗

statusArea.setText(account.status);
这里只有两个东西可以为null。状态区域和帐户。由于您在使用
statusArea
之前就初始化了它,因此它必须是
account

您需要先初始化帐户,然后才能使用它

BankAccount account = new BankAccount();
我可以看到您在try-catch块中尝试初始化
帐户

try {
        ObjectInputStream objectStream2 = new ObjectInputStream(
                new FileInputStream("bankAccounts.txt"));
        account = (BankAccount) objectStream2.readObject();
        objectStream2.close();
} catch (Exception e) {
        e.printStackTrace();
}

如果引发异常,
帐户
未初始化。在使用
帐户之前,请确保不会引发异常或检查
null

一种可能是用于序列化
银行帐户
bankAccounts.txt
的文件可能已损坏。这可能是因为类本身被修改了。在这种情况下,您可以临时替换

account = (BankAccount) objectStream2.readObject();

反序列化帐户中
。这将允许应用程序加载而不抛出
NPE


添加一个
ActionListener
调用
serializeAccount
并重新保存文件。现在可以还原
反序列化Account
方法,并且应用程序应该能够加载NPE插入的
显示GUI
行的
bankAccounts.txt

?使用
account==null
反序列化后,您是否检查了
account
是否为
null
?或者在try块中使用该帐户,或者在使用它之前检查它是否为null。@SteveB。在答案中添加了null检查。@HashshilingHacker尝试找出它为null的原因。当您尝试反序列化时会发生什么?(查看打印出来的stacktrace,使用断点等)为什么会发生这种情况?(例如,如果bankAccounts.txt不存在,则可能是
FileNotFoundException
)。正确的解决方案取决于发生了什么。@MAV我已经阅读了堆栈跟踪,并且理解了它。我对序列化非常陌生,对Java一般来说也很陌生,我只是想知道为什么它会变成null。它是在储存过程中死亡还是什么?帮帮我。。。“我迷路了!”散播黑客没有更多的信息,我不可能说任何具体的话。如果您从反序列化(而不是空指针)中了解stacktrace,请查找您使用的方法以了解抛出它的原因。
account = new BankAccount();