簡體   English   中英

Java Applet中的Java.lang NullPointerException

[英]Java.lang NullPointerException in Java Applet

大家晚上好。 我一直在絞盡腦汁試圖獨自回答這個問題,但我茫然不知所措,正在考慮扔東西。 讓我以這個事實作為我的問題的開頭,那就是這是一個學校項目,教師讓我重新提交,以試圖通過及格分數,我不是在尋找直接的副本和過去的代碼,但我需要幫助以找出答案如何解決這個問題呢。 原始代碼打開了applet,然后我開始了:applet未初始化錯誤。 在Eclipse中,我得到了java.lang.NullPointerException,其中有幾行我不知道它們來自何處。 請參閱代碼和錯誤列表。 提前致謝!

Error List
java.lang.NullPointerException
    at java.awt.Container.addImpl(Container.java:1091)
    at java.awt.Container.add(Container.java:971)
    at SodaMachine.init(SodaMachine.java:43)
    at sun.applet.AppletPanel.run(AppletPanel.java:434)
    at java.lang.Thread.run(Thread.java:745)

蘇打水機

import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;

@SuppressWarnings("serial")
public class SodaMachine extends Applet
{
    private TextField feedbackText;
    private TextField changeText;
    private TextField creditText;
    private Panel userMoneyPanel; //To hold Panel that shows current amount of money in machine, money due to user at end of transaction
    private Panel drinksPanel; //To hold Panel that shows available drink selections
    private Panel depositPanel; //To hold Panel that shows what money can be entered by user
    private Panel userFeedbackPanel;
    int colaStock = 3;
    int lemonLimeStock = 3;
    int grapeStock = 3;
    int rootBeerStock = 3;
    int waterStock = 3;
    double cost = 0.75;
    double credit = 0.00;
    double change = 0.00;


    public void init() 
    {

        //Panels to be built
        builduserMoneyPanel();
        builddrinksPanel();
        builddepositPanel();
        builduserFeedbackPanel();

        //layout manager for applet
        setLayout(new BorderLayout());

        //add Panels to applet
        add(depositPanel, BorderLayout.NORTH);
        add(userFeedbackPanel, BorderLayout.SOUTH);
        add(drinksPanel, BorderLayout.EAST);
        add(userMoneyPanel, BorderLayout.WEST);
    }

    //user Money Panel build method to show money in machine and user's change
    private void builduserMoneyPanel()
    {
        Panel userMoney = new Panel();
        Label creditLabel = new Label("Credit");
        Label changeLabel = new Label("Change");
        TextField creditText = new TextField(10);
        creditText.setEditable(false);
        TextField changeText = new TextField(10);
        changeText.setEditable(false);
        userMoney.setLayout(new GridLayout(2, 2));
        userMoney.add(creditLabel);
        userMoney.add(changeLabel);
        userMoney.add(creditText);
        userMoney.add(changeText);
    }

    //deposit method for user to add money to machine to make a transaction
    private void builddepositPanel()
    {
        Panel depositPanel = new Panel();
        Button nickelButton = new Button("INSERT NICKEL");
        Button dimeButton = new Button("INSERT DIME");
        Button quarterButton = new Button("INSERT QUARTER");
        Button dollarButton = new Button("INSERT DOLLAR");
        nickelButton.addActionListener(new nickelButtonListener());
        dimeButton.addActionListener(new dimeButtonListener());
        quarterButton.addActionListener(new quarterButtonListener());
        dollarButton.addActionListener(new dollarButtonListener());
        depositPanel.setLayout(new GridLayout(1, 4));
        depositPanel.add(nickelButton);
        depositPanel.add(dimeButton);
        depositPanel.add(quarterButton);
        depositPanel.add(dollarButton);
    }

    //method to show user available drink selection to choose from
    private void builddrinksPanel()
    {
        drinksPanel = new Panel();
        Button colaButton = new Button("COLA");
        Button lemonLimeButton = new Button("LEMON LIME");
        Button grapeButton = new Button("GRAPE");
        Button rootBeerButton = new Button("ROOT BEER");
        Button waterButton = new Button("WATER");
        colaButton.addActionListener(new colaButtonListener());
        lemonLimeButton.addActionListener(new lemonLimeButtonListener());
        grapeButton.addActionListener(new grapeButtonListener());
        rootBeerButton.addActionListener(new rootBeerButtonListener());
        waterButton.addActionListener(new waterButtonListener());
        drinksPanel.setLayout(new GridLayout(5, 1));
        drinksPanel.add(colaButton);
        drinksPanel.add(lemonLimeButton);
        drinksPanel.add(grapeButton);
        drinksPanel.add(rootBeerButton);
        drinksPanel.add(waterButton);
    }

    //method to tell user if drink is out of stock or if they have not added sufficent money to purchase drink
    private void builduserFeedbackPanel()
    {
        userFeedbackPanel = new Panel();
        TextField feedbackText = new TextField();
        feedbackText.setEditable(false);

    }

    //listeners for all drink choice buttons in applet
    private class colaButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");
            if(colaStock == 0)
            {
                feedbackText.setText("Insufficent stock available. Please make another selection.");
            }

            if(credit < cost)
            {
                feedbackText.setText("Insufficent funds. Please insert more money.");
            }

            if(credit >= cost)
            {
                colaStock -= 1;
                change = credit - cost;
                if(change == 0.00)
                {
                    changeText.setText("");
                }
                else
                {
                    changeText.setText(dollar.format(change));
                }
            }
        }
    }

    private class lemonLimeButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");

            if(lemonLimeStock == 0)
            {
                feedbackText.setText("Insufficent stock available. Please make another selection.");
            }

            if(credit < cost)
            {
                feedbackText.setText("Insufficent funds. Please insert more money.");
            }

            if(credit >= cost)
            {
                lemonLimeStock -= 1;
                change = credit - cost;
                if(change == 0.00)
                {
                    changeText.setText("");
                }
                else
                {
                    changeText.setText(dollar.format(change));
                }
            }
        }
    }

    private class grapeButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");

            if(grapeStock == 0)
            {
                feedbackText.setText("Insufficent stock available. Please make another selection.");
            }

            if(credit < cost)
            {
                feedbackText.setText("Insufficent funds. Please insert more money.");
            }

            if(credit >= cost)
            {
                grapeStock -= 1;
                change = credit - cost;
                if(change == 0.00)
                {
                    changeText.setText("");
                }
                else
                {
                    changeText.setText(dollar.format(change));
                }
            }
        }
    }

    private class rootBeerButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");

            if(rootBeerStock == 0)
            {
                feedbackText.setText("Insufficent stock available. Please make another selection.");
            }

            if(credit < cost)
            {
                feedbackText.setText("Insufficent funds. Please insert more money.");
            }

            if(credit >= cost)
            {
                rootBeerStock -= 1;
                change = credit - cost;
                if(change == 0.00)
                {
                    changeText.setText("");
                }
                else
                {
                    changeText.setText(dollar.format(change));
                }
            }
        }
    }

    private class waterButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");

            if(waterStock == 0)
            {
                feedbackText.setText("Insufficent stock available. Please make another selection.");
            }

            if(credit < cost)
            {
                feedbackText.setText("Insufficent funds. Please insert more money.");
            }

            if(credit >= cost)
            {
                waterStock -= 1;
                change = credit - cost;
                if(change == 0.00)
                {
                    changeText.setText("");
                }
                else
                {
                    changeText.setText(dollar.format(change));
                }
            }
        }
    }

    //listeners for all monetary choices available to user for purchasing drink
    private class nickelButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");
            credit += .05;
            creditText.setText(dollar.format(credit));
        }
    }

    private class dimeButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");
            credit += .10;
            creditText.setText(dollar.format(credit));
        }
    }

    private class quarterButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");
            credit += .25;
            creditText.setText(dollar.format(credit));
        }
    }

    private class dollarButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            DecimalFormat dollar = new DecimalFormat("'$'0.00");
            credit += 1.00;
            creditText.setText(dollar.format(credit));
        }
    }
}

在每個“ build”方法的第一行中,您似乎都在聲明Panel變量。 這些聲明大多數都是錯誤的。 變量已經在您的類中聲明為字段,您只需要實例化它們。 drinksPanel = new Panel(); 是正確的; Panel userMoney = new Panel(); 是錯的。 因此,私有字段userMoneyPanel不會被實例化,從而導致異常。 不過,這是很多代碼,如果我誤認為是問題,敬請原諒。

您沒有在構建器方法中設置字段。 這意味着在將字段添加到容器時,這些字段為null

例如

  private Panel userMoneyPanel;
  ...

  private void builduserMoneyPanel()
  {
     // Panel userMoney = new Panel();  // this is wrong...
     userMoneyPanel = new Panel();
     ...

在用於構建面板的不同方法中,您可以使用局部變量而不是初始化類中的字段。 例如:

private void builduserMoneyPanel()
{
    Panel userMoney = new Panel(); // <= This is not good !
    //...
}

做:

private void builduserMoneyPanel()
{
    userMoney = new Panel(); // initialise this.userMoney
    //...
}

4種構建方法相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM