从另一个Java类调用方法时出现问题

从另一个Java类调用方法时出现问题,java,Java,我遇到一个运行时错误,该错误在线程“AWT-EventQueue-0”java.lang.NullPointerException中声明异常 在Status.copyState(Status.java:29)这是一个调用Status calls(st)实例的类:Main类是: import javax.swing.*; import java.awt.event.*; import java.awt.*; /** * * * @author (Jason Sizemore) * @v

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

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;

    }
}
import java.util.*;
导入java.awt.event.*;
导入java.awt.*;
/**
*在这里写下类状态的描述。
* 
*@author(Jason Sizemore)
*@版本(HW09 11-21-09)
*这是一个获取撤消功能状态的类
*/
公共阶级地位扩展基本计算器
{   
//属性
私有ArrayList lastState;
公共字符串ls;
公共字符串rls;
//建设者
公众地位()
{
lastState=新阵列列表(10);
}
//方法
public void copyState()
{
//操作数1=Double.parseDouble(displayBox.getText());
ls=displayBox.getText();
添加(ls);
}
公共字符串returnState()
{
int sizeOfArrayList;
sizeOfArrayList=lastState.size();
rls=lastState.get(sizeOfArrayList);
返回rls;
}
}
我知道问题出在ls=displayBox.getText()行上;我让一个对象接受对象上方法的返回。我错过了什么


谢谢您的帮助。

我猜在调用
copyState
时,
displayBox
没有设置为任何值。
哪里是
displayBox
甚至声明的?

我猜在调用
copyState
时,
displayBox
没有设置为任何值。
哪里是
displayBox
甚至声明的位置?

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


让我知道这是否解决了问题

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


让我知道这是否解决了问题

正如其他人所说,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可以帮助您避免这种情况。

正如其他人所说,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可以帮助您避免这种情况。

声明或实例化的
dispayBox
在哪里?displayBox继承自该类扩展的计算器类。声明或实例化的
dispayBox
在哪里?displayBox继承自该类扩展的计算器类我猜是这样的
displayBox
是在类
Calculator
中创建的。我猜它是在那里声明的,但没有实例化,因为他在
copyState
获得了一个NPE,它显然不在那里。如果在
getText()
中有什么东西导致了错误,那么错误就在堆栈跟踪中,因此它不会到达那里,如果
ls
为null,那就无关紧要了。因此,
displayBox
肯定是空的。是的,displayBox类是在BasicCalculator类中创建的。假设异常是准确的,我们可以99.999%确定地说,在copyState()中displayBox是空的。插入一个日志或调试println来证明它,然后从那里返回。要进一步猜测,需要完整的堆栈跟踪。。。我猜,
displayBox
是在类
Calculator
中创建的。我猜它在那里声明了,但没有实例化,因为他在
copyState
上得到了一个NPE,它显然不在那里。如果在
getText()
中有什么东西导致了错误,那么错误就在堆栈跟踪中,因此它不会到达那里,如果
ls
为null,那就无关紧要了。因此,
displayBox
肯定是空的。是的,displayBox类是在BasicCalculator类中创建的。假设异常是准确的,我们可以99.999%确定地说,在copyState()中displayBox是空的。插入一个日志或调试println来证明它,然后从那里返回。要进一步猜测,需要完整的堆栈跟踪。。。并访问创建displayBox的超类。。。。如果BasicCalculator子类为Calculator,则BasicCalculator中的情况也一样。如果是另一种方式,它可以工作;)我并没有看到状态扩展了BasicCalculator,但Size_j只提供了更好的计算器。我不应该猜测类的层次结构。如果没有指定其他super(…)调用,super()将在子类构造函数中隐式调用。调用它是一种良好的做法,但不是必需的。在这里没什么区别。。。。如果BasicCalculator子类为Calculator,则BasicCalculator中的情况也一样。如果是另一种方式,它可以工作;)我并没有看到状态扩展了BasicCalculator,但Size_j只提供了更好的计算器。我不应该猜测类的层次结构。如果没有指定其他super(…)调用,super()将在子类构造函数中隐式调用。调用它是一种良好的做法,但不是必需的。在这里没有区别。