Java 在ActionListener中访问另一个类时发生NullPointerException
我正试图以标准方式向JButton添加ActionListener:在我拥有的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
私有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();
}
}