簡體   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