2009-11-23 69 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幫助你避免這種事情。