AWT-EventQueue-0 java.lang.NullPointerException с ActionListener

Я сталкиваюсь с этой ошибкой при попытке использовать ActionListener для вызова метода, который находится в другом классе:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MainProgram.actionPerformed(MainProgram.java:83)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(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.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.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)

Большинство решений этой ошибки, которые я нашел, заключались в том, что что-то в этой строке было нулевым, и, насколько я могу судить, здесь это не так (хотя я, вероятно, ошибаюсь).

Что должно произойти, так это то, что при нажатии «button1» (я знаю, плохая практика) он должен добавить 100 к наличным деньгам Джима и обновить JTextField «jimBalance» до нового значения.

Любой другой код, который я добавляю туда, работает нормально, пока я не вызову метод из другого класса, даже если это всего лишь одна строка, которая возвращает true или что-то в этом роде.

Строка ошибки (83) является

jim.GiveCash(100.0, jimBalance);

строка в методе actionPerformed.

Основной класс:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class MainProgram extends JFrame implements ActionListener{
    private JLabel label1;
    private JLabel label2;
    private static JTextField jimBalance;
    private static JTextField bobBalance;
    private JButton button1;
    private JButton button2;
    private JTextField jimPayment;
    private JTextField bobPayment;
    private Guy jim;
    private Guy bob;

    public static void main(String[] args) {
        MainProgram mainWindow;
        mainWindow = new MainProgram();
        mainWindow.init();
        mainWindow.setSize(400,110);
        mainWindow.setVisible(true);

        Guy jim = new Guy();
        Guy bob = new Guy();

        jim.ReceiveCash(200, jimBalance);


        jimBalance.setText(String.valueOf(jim.cash()));
        bobBalance.setText(String.valueOf(bob.cash()));


    }

    public void init(){
        Container pane = this.getContentPane();
        pane.setLayout(null);
        label1 = new JLabel();
        label1.setBounds(10,10,50,20);
        label1.setText("Jim");
        pane.add(label1);
        label2 = new JLabel();
        label2.setBounds(10,40,50,20);
        label2.setText("Bob");
        pane.add(label2);

        jimBalance = new JTextField();
        jimBalance.setBounds(50,10,100,20);
        jimBalance.setEditable(false);
        pane.add(jimBalance);
        bobBalance = new JTextField();
        bobBalance.setBounds(50,40,100,20);
        bobBalance.setEditable(false);
        pane.add(bobBalance);

        button1 = new JButton();
        button1.setBounds(160,10,100,20);
        button1.setText("Give Bob");
        pane.add(button1);
        button2 = new JButton();
        button2.setBounds(160,40,100,20);
        button2.setText("Give Jim");
        pane.add(button2);

        button1.addActionListener(this);

        jimPayment = new JTextField();
        jimPayment.setBounds(270,10,100,20);
        pane.add(jimPayment);
        bobPayment = new JTextField();
        bobPayment.setBounds(270,40,100,20);
        pane.add(bobPayment);
    }

    public void actionPerformed(ActionEvent e){
        jim.GiveCash(100.0, jimBalance);
    }
}

И класс парня:

import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Guy {
    public String Name;
    public double cash;
    public void GiveCash(double amount, JTextField balance)
    {
        if((cash - amount) >= 0){
            cash = cash - amount;
            balance.setText(String.valueOf(cash));
        }else{
            JOptionPane.showMessageDialog(null, "You cannot afford that transaction!", "Error", JOptionPane.WARNING_MESSAGE);
        }
    }

    public void ReceiveCash(double amount, JTextField balance) { 
        cash = cash + amount;
        balance.setText(String.valueOf(cash));
    }
}

person cogm    schedule 16.09.2014    source источник


Ответы (1)


Ниже я показываю вашу проблему:

В (1) вы определяете объектную переменную jim.

В (2) вы определяете локальную переменную в статическом контексте.

В (3) jim все еще null, так как это не инициализированная объектная переменная, которую вы не можете инициализировать из статического контекста (например, метод main()).

public class MainProgram extends JFrame implements ActionListener {
// Omit some code
private Guy jim; // (1)
private Guy bob;

public static void main(String[] args) {
    // Omit some code

    Guy jim = new Guy(); // (2)
    Guy bob = new Guy();

    jim.ReceiveCash(200, jimBalance);

    // Omit some code
}

// Omit some code

public void actionPerformed(ActionEvent e) {
    jim.GiveCash(100.0, jimBalance); // (3)
}

}

person Uwe Plonus    schedule 16.09.2014
comment
Ага, спасибо. Как мне тогда инициализировать Джима и Боба вне основного метода? Я попытался инициализировать их в той же строке, в которой я их объявил, но тогда я не могу ссылаться на них изнутри main(). - person cogm; 16.09.2014
comment
@Murreey Пожалуйста, задайте новый вопрос (или лучше воспользуйтесь поиском, поскольку этот вопрос уже задавался), как получить доступ к нестатическим переменным из основного метода. - person Uwe Plonus; 16.09.2014