簡體   English   中英

有人可以解釋為什么我在Java中遇到此錯誤嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM