2010-07-12 54 views
1

代碼的用途:創建兩個按鈕(button1和button2)。當用戶單擊按鈕1時,更改按鈕2的文本。當用戶單擊按鈕2時,更改button1的文本。運行多個Action事件時出現NullPointerException

下面是我使用的代碼:它編譯完美

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class multiAL { 
JButton button1; 
JButton button2; 
JFrame frame; 
public static void main(String[] args) { 
    multiAL setterAL = new multiAL(); 
    setterAL.go(); 
} 

public void go() { 
    button1 = new JButton("Click me, I'm One"); 
    button2 = new JButton("Click me, I'm Two"); 
    frame.setSize(500,500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(BorderLayout.WEST, button1); 
    frame.getContentPane().add(BorderLayout.EAST, button2); 
    frame.setVisible(true); 
    button1.addActionListener(new b1L()); 
    button2.addActionListener(new b2L()); 
} 

class b1L implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     button2.setText("What??, you clicked 1??"); 
    } 
} 

class b2L implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     button1.setText("What??, you clicked 2??"); 
    } 
    } 
} 

,但是當我運行它,我收到以下錯誤:現在 Exception in thread "main" java.lang.NullPointerException at multiAL.go(multiAL.java:17) at multiAL.main(multiAL.java:11)

爲止,我只遇到編譯時錯誤。所以我想問兩個問題:

1)代碼有什麼問題? 2)如何追蹤運行時錯誤?

+0

文件名後的數字爲您的實際行,其中錯誤順便說一下,發生了。 – Gnoupi 2010-07-12 10:01:28

+1

請參見「命名規則」 - http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html 「類名應爲名詞,大小寫一致,每個內部單詞的首字母大寫。儘量保持你的類名簡單和描述性。使用整個單詞 - 避免首字母縮略詞和縮寫。「 – 2010-07-12 10:05:44

+1

下次我會記住這一點。 – MoonStruckHorrors 2010-07-12 10:09:44

回答

2

frame沒有初始化,所以它解析爲null,你不能調用null對象的方法。像你初始化button1button2你也應該初始化frame

frame = new JFrame(); 
2

但哪一個

frame = new JFrame(); 

行代碼?由於框爲空,什麼都可能發生,我猜...

3

我相信你的框架對象爲空。它從未初始化。您可以閱讀運行時異常。它說multiAL.java:17

這意味着,在17行,你讓你的NullPointerException

+0

這些錯誤會讓我有一天被殺。 但仍然存在一個問題。從哪裏開始數線? – MoonStruckHorrors 2010-07-12 10:05:22

+1

從文件的頂部 – 2010-07-12 10:06:34

+1

@MoonStruckHorrors,嘗試使用像eclipse這樣的IDE。日食向您顯示行號。另外,stacktrace的一部分會變成超鏈接,因此您可以單擊該例外並跳轉到導致它的那一行。如果您使用命令行* nix卡住,請使用VIM並使用跳轉至命令行。 '跳到第n行。例如,要跳轉到第42行,您需要輸入:42' – 2010-07-12 10:40:14

0

考慮重命名你的類遵循Java類名約定:駝峯(http://en.wikipedia.org/wiki/CamelCase

而對於這個問題,如指出其他用戶,是框架對象未被初始化。

添加以下行之前,首先使用幀對象:

frame = new JFrame(); 
frame.setSize(500,500); 
+0

這與問題無關。下次使用評論。直到你無法避免使用答案作爲評論,或者你的方式50代表將很長;-) – 2010-07-12 10:05:13

+0

謝謝,我是新來的。我會在下次做。 – Zheileman 2010-07-12 10:10:34

1

初始化框架的第一個使用前:

frame = new JFrame();