NullPointerException при доступе к другому классу в ActionListener - PullRequest
0 голосов
/ 03 сентября 2011

Я пытаюсь добавить ActionListener в JButton стандартным способом: вне метода, который у меня есть 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(); запускается, но как только он добирается до любого изметоды внутри класса вкладок, я получаю следующую ошибку:

Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException в graphicalUI.Tabs.updateDatabaseMCombo (Tabs.java:148)в Engine.Actions.actionPerformed (Actions.java:31) в javax.swing.AbstractButton.fireActionPerformed (Неизвестный источник) в javax.swing.AbstractButton $ Handler.actionPerformed (Неизвестный источник) в javax.swing.DefaultButtonModel.fireAknownfor) в javax.swing.DefaultButtonModel.setPressed (Неизвестный источник) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased (Неизвестный источник)на java.awt.AWTEventMulticaster.mouseReleased (неизвестный источник) на java.awt.Component.processMouseEvent (неизвестный источник) на javax.swing.JComponent.processMouseEvent (неизвестный источник) на java.awt.Component.processEvent (неизвестный источник на java.awt.Container.processEvent (Неизвестный источник) в java.awt.Component.dispatchEventImpl (Неизвестный источник) в java.awt.Container.dispatchEventImpl (Неизвестный источник) в java.awt.Component.dispatchEvent (Неизвестный источник) в java.awt.LightweightDispatcher.retargetMouseEvent (Unknown Source) в java.awt.LightweightDispatcher.processMouseEvent (Unknown Source) в java.awt.LightweightDispatcher.dispatchEvent (Unknown Source) в java.awt.Container.dispatchEventImpl (Unknown Source) в java.awt.Window.dispatchEventImpl (неизвестный источник) в java.awt.Component.dispatchEvent (неизвестный источник) в java.awt.EventQueue.dispatchEventImpl (неизвестный источник) в java.awt.EventQueue.access $ 000 (неизвестный источник) в java.awuet.vent 3.run (Неизвестный источник) на java.awt.EventQueue $ 3.run (Неизвестный источникe) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (неизвестный источник) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (неизвестный источник) в java.awt.Runue ($).Неизвестный источник) в java.awt.EventQueue $ 4.run (Неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (Неизвестный источник) в java.awt.EventQueue.disatchНеизвестный источник) в java.awt.EventDispatchThread.pumpOneEventForFilters (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForFilter (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy (Неизвестный источник.Прив.) в 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>object.


UPDATE


Хорошо, после некоторой отладки я обнаружил, что мое исключение 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();
    }
}

Кто-нибудь есть идея?

Теперь я думаю, что это потому, что слушатель действия и метод находятся вразные пакеты ...

1 Ответ

2 голосов
/ 04 сентября 2011

Хорошо, к сожалению, это не совсем то, что я имел в виду или хотел сделать, но я, по крайней мере, заставил его работать сейчас!

Оказывается, по какой-то причине до сих пор мне неизвестно, что любой другой класс, кроме самого класса Tabs, который называл updateDatabaseMCombo() или setDatabaseManagementContent(String, boolean), генерировал нулевые указатели! Итак, я только что укусил пулю и поместил список действий в класс Tabs ...

Да ладно, мои конечные пользователи не будут знать ничего другого.

...