从另一个Java类调用方法的问题

时间:2009-11-23 17:20:31

标签: java

我遇到运行时错误,在线程“AWT-EventQueue-0”中声明Exception java.lang.NullPointerException     在Status.copyState(Status.java:29)这是一个调用Status调用实例的类(st):主类是:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
/**
 *
 * 
 * @author (Jason Sizemore) 
 * @version (11-20-09 HW09)
 */
public class BetterCalculator extends Calculator 
{   
    //attributes
    private JButton undo; 
    private String undoText;
    private Status st;

    public BetterCalculator()
    {
        super();
        st = new Status();

    }
    public void createUserInterface3()
    {
        createUserInterface2();
        undo = new JButton("undo");
        jPanel.add(undo);
        undo.setBackground(Color.red);
       undo.setToolTipText("This is the undo feature");
       undo.addActionListener(this);

    }
     public void actionPerformed(ActionEvent e)
     {
     super.actionPerformed(e);
     while(displayBox.getText() != null)
     {
         st.copyState();

        }
     if(e.getSource() == undo)
      {

        Status st;
        st = new Status();
       undoText = st.returnState();
        displayBox.setText(undoText);


      }

    }
    public static void main(String[] args)
    {

        BetterCalculator myCalc;
        myCalc = new BetterCalculator();
        myCalc.createUserInterface3();
    }
}

调用Status(st)的实例这是Status类

import java.util.*;
import java.awt.event.*;
import java.awt.*;
/**
 * Write a description of class Status here.
 * 
 * @author (Jason Sizemore ) 
 * @version (HW09 11-21-09)
 *  This is a class to get the status for the undo feature
 */
public class Status extends BasicCalculator
{   
    //attributes
   private ArrayList<String> lastState;
   public String ls;

   public String rls;  
    //constructors

    public Status()
    {
       lastState = new ArrayList<String>(10);

    }

    //Methods
    public void copyState()
    {
         //operand1 = Double.parseDouble(displayBox.getText());
          ls = displayBox.getText();
        lastState.add(ls);

    }
    public String returnState()
    {
       int sizeOfArrayList; 
       sizeOfArrayList = lastState.size();
        rls = lastState.get(sizeOfArrayList);
        return rls;

    }
}

我知道问题在于行ls = displayBox.getText();我有一个对象在一个对象上返回一个方法。我在这里失踪了什么。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我的猜测是displayBox在调用copyState时未设置为任何内容。 displayBox甚至宣布在哪里?

答案 1 :(得分:1)

正如其他人所说,displayBox变量很可能是null。

解决这个问题的最佳方法是在编译时......如果你达到以下习惯,你会早早发现这种错误:

public class TestFrame
    extends JFrame
{
    private final JButton aButton;
    private JButton bButton;

    public TestFrame()
    {
        // fails to compile since aButton is not instantiated
        // aButton = new JButton("A"); 
    }

    public init()
    {
        add(aButton);
        add(bButton);
        aButton.addActionListener(....);

        // crash at runtime since bButton is null
        bButton.addActionListener(....); 
    }
}

通过将变量声明为“final”,编译器会强制您为它们赋值。由于按钮(和其他GUI项目)不太可能改变,您应该能够将它们全部改为最终。一旦你拥有了它,你将拥有com; iler帮助你避免这种事情。

答案 2 :(得分:0)

尝试添加以下行作为Status.Status()的第一行:

super();

如果能解决问题,请告诉我们!