2009-11-23 36 views
0

我有一个运行时错误,指出线程中的异常“AWT-EventQueue-0”java.lang.NullPointerException at Status.copyState(Status.java:29)这是一个类即拨打呼叫的状态(ST)的一个实例:主类是:调用另一个Java类的方法的问题

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(); 
    } 
} 

它是通过状态的一个实例(ST)下面是状态类

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

'dispayBox'声明或甚至实例化在哪里? – 2009-11-23 17:25:52

+0

displayBox继承自这个类继承的Calculator类 – 2009-11-23 17:30:41

回答

0

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

super(); 

让我知道是否能解决问题!

+0

...和BasicCalculator中的相同,如果BasicCalculator子类计算器。如果这是相反的方式,它可以工作;) – 2009-11-23 17:32:42

+0

我没有看到Status扩展BasicCalculator,但Size_j只提供了BetterCalculator。我不应该猜到类的层次结构。 – 2009-11-23 18:27:06

+0

如果没有指定其他super(...)调用,super()将在子类构造函数中隐式调用。调用它是一个很好的习惯,但不是必需的。这里没有什么区别。 – PSpeed 2009-11-23 23:05:25

2

我的猜测是,在调用copyState时,displayBox未被设置为任何值。 displayBox甚至宣布?

+0

我猜'displayBox'是在'Calculator'类中创建的。 – 2009-11-23 17:28:55

+0

我猜它是在那里声明的,但没有实例化,因为他在'copyState'处得到一个NPE,显然它不存在。如果'getText()'中有一些导致错误的东西,那就是错误发生的地方,在堆栈跟踪中,所以它不会到达那里,如果'ls'为空,那就没有关系。所以肯定是'displayBox'为null的情况。 – 2009-11-23 17:32:06

+0

是的displayBox类是在BasicCalculator类中创建的 – 2009-11-23 18:26:42

1

正如其他人所说,displayBox变量可能为空。

对付它的最好方法是在编译的时候......如果你进入下面的习惯,你会赶上那种错误的早期:

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(....); 
    } 
} 

通过声明变量作为“最终”编译器迫使你给他们一个价值。由于按钮(和其他GUI项目)不可能改变,所以应该能够使它们都是最终的。一旦你有了这些,你将拥有com; iler帮助你避免这种事情。