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

Java 在ActionListener中访问另一个类时发生NullPointerException,java,swing,awt,jcombobox,actionlistener,Java,Swing,Awt,Jcombobox,Actionlistener,我正试图以标准方式向JButton添加ActionListener:在我拥有的私有ActionListener方法之外和我放置的方法的内部 listener = new Actions(); // Create the action listener object // Add action listeners to the necessary components isDatabaseDefault.addActionListener(listener); addE

我正试图以标准方式向JButton添加ActionListener:在我拥有的
私有ActionListener方法之外和我放置的方法的内部

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);
        }
    }

}
当我按下按钮时,“空指针异常”打印出来,并且
数据库.makeNewDatabase()运行,但一旦它到达tabs类中的任何一个方法,我就会收到以下错误:

线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 在graphicalUI.Tabs.updateDatabaseMCombo(Tabs.java:148)中 Actions.Actions.actionPerformed(Actions.java:31)在 javax.swing.AbstractButton.fireActionPerformed(未知源代码)位于 javax.swing.AbstractButton$Handler.actionPerformed(未知源代码)位于 javax.swing.DefaultButtonModel.fireActionPerformed(未知源代码)位于 javax.swing.DefaultButtonModel.setPressed(未知源代码)位于 javax.swing.plaf.basic.BasicButtoListener.mouseReleased(未知 源代码)位于java.awt.AWTEventMulticaster.mouseRelease(未知源代码) 位于java.awt.Component.ProcessMouseeEvent(未知源) javax.swing.JComponent.ProcessMouseeEvent(未知源代码)位于 位于的java.awt.Component.processEvent(未知源) 位于的java.awt.Container.processEvent(未知源) 位于的java.awt.Component.dispatchEventImpl(未知源) 位于的java.awt.Container.dispatchEventImpl(未知源) 位于的java.awt.Component.dispatchEvent(未知源) 位于的java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源) 位于的java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源) 位于的java.awt.LightweightDispatcher.dispatchEvent(未知源) 位于的java.awt.Container.dispatchEventImpl(未知源) 位于的java.awt.Window.dispatchEventImpl(未知源) 位于的java.awt.Component.dispatchEvent(未知源) 位于的java.awt.EventQueue.dispatchEventImpl(未知源) java.awt.EventQueue.access$000(未知源) java.awt.EventQueue$3.run(未知源代码)位于 java.awt.EventQueue$3.run(未知源代码)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 源代码)位于java.awt.EventQueue$4。运行(未知源代码)位于 java.awt.EventQueue$4.run(未知源代码)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 源代码)位于java.awt.EventQueue.dispatchEvent(未知源代码)位于 java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) 位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源) 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(未知 源代码)位于java.awt.EventDispatchThread.pumpEvents(未知源代码) 位于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);
        }
    }
有人知道吗


我现在认为这是因为动作监听器和方法在不同的包中…

好吧,不幸的是,这并不完全是我的想法或想要做的,但至少我现在已经让它工作了

事实证明,出于某种我还不知道的原因,除了
选项卡
类本身之外,调用
updateDatabaseMCombo()
setDatabaseManagementContent(String,boolean)
的任何其他类都会生成空指针!所以,我刚刚咬紧牙关,将actionlistener放在
选项卡的
类中


哦,好吧,我的最终用户不会知道任何不同。

graphicalUI.Tabs.setDatabaseManagementContent(Tabs.java:273)
是发生空指针异常的地方。您发布的代码中没有显示此方法,因此无法回答。(你的第二段代码没有调用它)为了更快地获得更好的帮助,请发布一个。对不起,我提供的错误代码是我注释掉前面的方法时产生的。有关更新的错误消息,请再次查看我的帖子;现在,我发布的代码与我提出的问题相关@安德鲁,谢谢你的链接。不幸的是,我现在没有时间全部阅读,但我相信它会非常方便,所以我一定会在某个时候阅读它@安迪:阅读graphicalUI.Tabs.updateDatabaseMCombo(Tabs.java:148)中线程“AWT-EventQueue-0”java.lang.NullPointerException中的stacktrace:Exception。例外情况发生在那里。不管怎样,如果你不发布SSCCE,就不可能告诉你更多。@Andy:是的,这无关紧要。如果您使用SQLite试图从不同的线程访问数据库,可能会出现问题。顺便说一句,你还没有发布SSCCE。请做吧。
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();
    }
}