从另一个Java类调用方法时出现问题
我遇到一个运行时错误,该错误在线程“AWT-EventQueue-0”java.lang.NullPointerException中声明异常 在Status.copyState(Status.java:29)这是一个调用Status calls(st)实例的类:Main类是:从另一个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
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()将在子类构造函数中隐式调用。调用它是一种良好的做法,但不是必需的。在这里没有区别。