我遇到运行时错误,在线程“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();我有一个对象在一个对象上返回一个方法。我在这里失踪了什么。
感谢您的帮助。
答案 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();
如果能解决问题,请告诉我们!