繁体   English   中英

在ActionListener中访问另一个类时发生NullPointerException

[英]NullPointerException when accessing another class in ActionListener

我试图以一种标准方式向JButton添加ActionListener:在方法之外,我有private Actions listener; 在我已经放入的方法中

listener = new Actions(); // Create the action listener object 

    // Add action listeners to the necessary components
    isDatabaseDefault.addActionListener(listener);
    addEntry.addActionListener(listener);
    editEntry.addActionListener(listener);
    deleteEntry.addActionListener(listener);
    addDatabase.addActionListener(listener);
    editDatabase.addActionListener(listener);
    deleteDatabase.addActionListener(listener);

并且运行正常,没有发现错误-这是ActionListener类:

package engines;

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

import javax.swing.JOptionPane;

import graphicalUI.Tabs;

public class Actions implements ActionListener, SoftwareProperties{
    // Create objects to access methods
    private DatabaseManagement database;
    private Tabs tabs;

    public Actions(){
        this.database = new DatabaseManagement();
        this.tabs = new Tabs();
    }

    // Method that is called when a button is clicked
    public void actionPerformed(ActionEvent e) {
        // Check the source of the action
        if(e.getActionCommand().equals("Make a new database")){
            System.out.println("Null pointer exception");
            String location = database.makeNewDatabase();
            if(location==null){
                JOptionPane.showMessageDialog(null, "Error: Your new database was not successfully created. Please try again if you like.", applicationName, JOptionPane.WARNING_MESSAGE);
                return;
            }
                        tabs.updateDatabaseMCombo();
            tabs.setDatabaseManagementContent(location, true);
        }
    }

}

当我按下按钮时,尽管会输出“ Null Pointer Exception”,并且出现了database.makeNewDatabase(); 运行,但是一旦它进入tabs类中的任何一个方法,我就会收到以下错误:

javax.swing.AbstractButton.fireActionPerformed()上engine.Actions.actionPerformed(Actions.java:31)上图形UI.Tabs.updateDatabaseMCombo(Tabs.java:148)上的线程“ AWT-EventQueue-0”中的java.lang.NullPointerException异常javax.swing.DefaultButtonModel.setPressed中的javax.swing.DefaultButtonModel.fireActionPerformed(未知源)处的javax.swing.DefaultButtonModel.setPressed(未知源)处的javax.swing.plaf.basic中的Unknown Source)。 java.awt.AWTEvent中的BasicButtonListener.mouseReleased(未知源)AWTEventMulticaster.mouseReleased(未知源)在java.awt.Component.processMouseEvent(未知源)在javax.swing.JComponent.processMouseEvent(java.awt.Component中。 java.awt.Container.dispatchEventImpl(未知源)java.awt.Component.dispatchEventImpl(java.awt.Component.dispatchEventImpl(未知源)java.awt.Component.dispatchEventImpl(未知源)未知源),位于java.awt.LightweightDispatcher.r java.awt.LightweightDispatcher.processMouseEvent(未知源)的etargetMouseEvent(未知源)java.awt.Container.dispatchatchEventImpl(java.awt.Container.dispatchEventImpl(未知源)的java.awt.LightweightDispatcher.dispatchEvent(未知源)未知源)java.awt.Component.dispatchEvent(未知源)java.awt.EventQueue.dispatchEventImpl(未知源)java.awt.EventQueue.access $ 000(未知源)java.awt.EventQueue $ 3.run( java.awt.EventQueue $ 3.run中的Unknown Source)(java.security.AccessController.doPrivileged(本机方法)处的java.security.ProtectionDomain $ 1.doIntersectionPrivilege(本机方法)处的java.security.ProtectionDomain $ 1.doIntersectionPrivilege的未知源) (未知源)在java.awt.EventQueue $ 4.run(未知源)在java.awt.EventQueue $ 4.run(在java.security.AccessController.doPrivileged(本地方法)在java.security.ProtectionDomain $ 1。 java.awt.EventQueue.dispatchEve上的doIntersectionPrivilege(未知源) nt(未知源)(java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) java.awt.EventDispatchThread.pumpEvents(源未知)(java.awt.EventDispatchThread.run中的未知源)

但是奇怪的是,当我在同一个类中运行这些方法时,它们可以完美地工作! 这是updateDatabaseMCombo()方法:

public void updateDatabaseMCombo(){
        System.out.println("is this method running");
        int sIndex = selectDatabase.getSelectedIndex(); // Get the number value of the selected item
        String selectedItem = selectDatabase.getItemAt(sIndex); // Get the string of the selected item
        System.out.println(selectedItem);
        availableDBs4DM = db.getAvailableDatabases4DB(null); // Get a list of available databases to manage
        selectDatabase.removeAllItems(); // Remove all the current items in the combo
        // Loop through the array and manually add each item
        for(String item : availableDBs4DM)
            selectDatabase.addItem(item);
        // Select the item that was previously selected 
        int search = -1; // Initialise variable to hold the search results
        for(int s = 0; s < availableDBs4DM.length; s++){
            // If a match is found, update the search variable and stop searching
            if(availableDBs4DM[s].equals(selectedItem)){
                search = s;
                break;
            }
        }

        if(search != -1){
            // If the database that was previously selected is still in the JCombobox
            selectDatabase.setSelectedIndex(search);
        }else{
            // Select the default database
            db.setTranslationDefaultDB(selectDatabase);
        }
    }

那么谁能弄清楚为什么我会收到此错误?

顺便说一句, selectDatabase已经被初始化为JComboBox<String>对象。


更新


好的,经过一些调试之后,我发现NullPointerException是因为我只在方法的外部声明了变量,就像private JComboBox<String> selectDatabase; 我实际上是用另一种方法来初始化它,如下所示:

package test;
import java.awt.FlowLayout;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;

import test2.Runner;


public class DBCombo {
    private JComboBox<String> combo = new JComboBox<String>();

    public JPanel makePanel(){
        JPanel panel = new JPanel(new FlowLayout());

        String[] options = {"Why", "will", "this", "not", "work"};
        combo.setModel(new DefaultComboBoxModel<String>(options));

        panel.add(combo);

        Runner main = new Runner();

        JButton doRead = new JButton("Read");
        doRead.addActionListener(main);

        panel.add(doRead);

        return panel;
    }

    public void getComboData(){
        System.out.println(combo.getItemCount());
    }
}

package test2;


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

import javax.swing.JFrame;

import test.DBCombo;


public class Runner implements ActionListener {
    public static void main(String[] args){
        JFrame frame = new JFrame("Test");

        DBCombo dbc = new DBCombo();

        frame.setContentPane(dbc.makePanel());
        frame.pack();
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e){
        new DBCombo().getComboData();
    }
}

有个主意吗?

我现在认为这是因为动作侦听器和方法位于不同的程序包中...

好的,不幸的是,这并不是我的初衷或想做的,但是至少我现在可以使它正常工作了!

事实证明,由于某种原因,我仍然不知道,除Tabs类本身之外的任何其他类updateDatabaseMCombo()称为updateDatabaseMCombo()setDatabaseManagementContent(String, boolean)生成空指针! 所以,我只是硬着头皮,将actionlistener放在Tabs类中...

哦,好吧,这并不是说我的最终用户会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM