使用关联时的nullpointer

时间:2014-04-07 17:04:00

标签: java jframe joptionpane

我正在用Java制作发票程序。我正在制作一个框架并链接到发票类。在Invoice-class中有一个名为hasInvoice(iNr)的方法。当我尝试检查发票编号是否已经存在时,我会得到一个Nullpointer。

public class FinancienAanmakenFrame extends JFrame implements ActionListener {

    private JLabel nummer, soort, prijs, empty, totaal;
    private JTextField tfnum;
    protected JTextArea tasoort, taprijs;
    protected JTextField tftotaal;
    private JButton ok, terug, dienst;
    private JPanel p;

    private Financien deFinancien;
    private Voorraad deVoorraad;
    private FinancienAanmakenFrame deBon;
    private FinancienWijzigenFrame deWijziging;

    public FinancienAanmakenFrame(Financien f, Voorraad v) {
        deFinancien = f;
        deVoorraad = v;
        deBon = this;

        p = new JPanel();
        add(p);
        p.setLayout(new GridLayout(6, 2, 2, 2));

        nummer = new JLabel("Factuur nummer: ");
        p.add(nummer);
        tfnum = new JTextField();
        p.add(tfnum);
        dienst = new JButton("Voeg betaling toe");
        p.add(dienst);
        dienst.addActionListener(this);
        empty = new JLabel();
        p.add(empty);
        soort = new JLabel("Soort dienst:");
        p.add(soort);
        prijs = new JLabel("Kosten:");
        p.add(prijs);
        tasoort = new JTextArea(20, 10);
        p.add(tasoort);
        tasoort.setEditable(false);
        taprijs = new JTextArea(20, 10);
        p.add(taprijs);
        taprijs.setEditable(false);
        totaal = new JLabel("Totale kosten");
        p.add(totaal);
        tftotaal = new JTextField("0");
        p.add(tftotaal);
        tftotaal.setEditable(false);

        terug = new JButton("Terug naar financien menu");
        p.add(terug);
        terug.addActionListener(this);
        ok = new JButton("Maak factuur aan");
        p.add(ok);
        ok.addActionListener(this);

        setSize(450, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(HIDE_ON_CLOSE);
    }

    public boolean allesGevuld() {
        if ((tfnum.getText().length() > 0) && (tftotaal.getText().length() > 0)) {
            return true;
        } else {
            return false;
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == terug) {
            this.setVisible(false);
        }

        else if (e.getSource() == dienst) {
            DienstFrame bf = new DienstFrame(deFinancien, deVoorraad, deBon,
                    deWijziging);
            bf.setVisible(true);
        }

        else if (e.getSource() == ok) {
            int fN = Integer.parseInt(tfnum.getText());
            if (!deFinancien.heeftFactuur(fN) && allesGevuld()) {
                Factuur nwF = new Factuur(fN);
                if (nwF != null) {
                    if (deFinancien.voegFactuurToe(nwF)) {
                        JOptionPane.showMessageDialog(null,
                                "Factuur is toegevoegd", "Succes",
                                JOptionPane.PLAIN_MESSAGE);
                        dispose();
                    }
                }
            } else {
                tfnum.setText("");
                JOptionPane.showMessageDialog(null,
                        "Er bestaat al een factuur met dit nummer", "Mislukt",
                        JOptionPane.PLAIN_MESSAGE);
            }
        } else { // niet alle gegevens zijn ingevuld
            JOptionPane.showMessageDialog(null, "Vul alle gegevens in",
                    "Mislukt", JOptionPane.PLAIN_MESSAGE);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您声明deFinancien变量如:

private Financien deFinancien;

但是你从未初始化变量,并尝试访问:

deFinancien.heeftFactuur(fN)

您尝试在构造函数中初始化相同的内容:

public FinancienAanmakenFrame(Financien f, Voorraad v) {
        deFinancien = f;...

但是你再次传递相同的引用(而不是值):

new DienstFrame(deFinancien, deVoorraad, deBon,
                    deWijziging);

这就是它抛出空指针异常的原因。