Может кто-нибудь объяснить, почему я получаю эту ошибку в Java? - PullRequest
0 голосов
/ 01 декабря 2011
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 с меткой и кнопкой в ​​нем.Когда я нажимаю кнопку, я хочу, чтобы приложение изменило текст метки на «тест» по сравнению с тем, что было раньше.

Ответы [ 3 ]

4 голосов
/ 01 декабря 2011

Здесь

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 по-прежнему равно нулю;

Просто сделайте это:

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();
1 голос
/ 01 декабря 2011

Вы должны начать использовать редактор, такой как Eclipse или NetBeans и обратить внимание на предупреждения.Они бы точно сказали вам, что было не так (то, что ваша переменная скрывала переменную-член).

Java дает удивительные предупреждения - «Придирчивость» Java заставляет многих думать, что язык более «сложный», нона самом деле делает это намного проще.Язык со слабым синтаксисом действительно намного сложнее в долгосрочной перспективе.

1 голос
/ 01 декабря 2011

У вас есть два экземпляра JF.Один является членом класса и не инициализирован.Другая - это локальная переменная внутри конструктора, которая инициализируется.Поэтому, когда вызывается addButton, вы пытаетесь получить доступ к переменной-члену, которая имеет значение null и, следовательно, NullPointerException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...