[英]Can someone explain why I'm getting this error in Java?
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at A_test.addButton(A_test.java:27)
at A_test.<init>(A_test.java:17)
at Main$1.run(Main.java:11)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
主班
import javax.swing.*;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new A_test();
}
});
}
}
A_test課程
import java.awt.event.*;
import javax.swing.*;
public class A_test implements ActionListener {
private JFrame jf;
public A_test() {
JFrame jf = new JFrame("A simple swing Program");
jf.setSize(275,100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jl = new JLabel("Swing powers the modern JAVA GUI");
jf.getContentPane().add(jl);
this.addButton();
jf.setVisible(true);
}
public void addButton() {
JButton jb = new JButton("Submit");
jf.getContentPane().add(jb);
jb.addActionListener(this);
jf.getContentPane().add(jb);
}
@Override
public void actionPerformed(ActionEvent ae) {
((JLabel) jf.getContentPane().getComponent(0)).setText("test");
}
}
我使用A_test類來創建一個帶有標簽和按鈕的JFrame。 當我按下按鈕時,我希望應用程序將標簽的文本從以前的內容更改為“測試”。
這里
JFrame jf = new JFrame("A simple swing Program");
jf.setSize(275,100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jl = new JLabel("Swing powers the modern JAVA GUI");
jf.getContentPane().add(jl);
this.addButton();
jf.setVisible(true);
您正在創建新的JFrame,而不是將私有實例變量分配給新的JFrame。 在您達到這一點時:
JButton jb = new JButton("Submit");
jf.getContentPane().add(jb);
jb.addActionListener(this);
jf.getContentPane().add(jb);
jf
仍然為null;
只是這樣做:
jf = new JFrame("A simple swing Program");
jf.setSize(275,100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jl = new JLabel("Swing powers the modern JAVA GUI");
jf.getContentPane().add(jl);
this.addButton();
您有兩個jf實例。 一個是該類的成員,並且沒有初始化。 另一個是初始化的構造函數中的局部變量。 因此,在調用addButton時,您嘗試訪問的成員變量為null,因此將訪問NullPointerException。
您應該開始使用Eclipse或netbeans之類的編輯器,並注意警告。 他們會確切地告訴您出了什么問題(您的變量隱藏了一個成員變量)。
Java發出了令人敬畏的警告-Java的“ Pickyness”使許多人認為該語言更“難”,但實際上使它變得更加容易。 從長遠來看,語法寬松的語言確實要難得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.