Java JButton ActionListener的错误

Java JButton ActionListener的错误,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我在为JButton添加ActionListener时遇到问题,请帮助解决此问题 错误: Exception in thread "main" java.lang.NullPointerException at searchDB.searchDB(searchDB.java:11) at Ramses.main(Ramses.java:35) 主类:Ramses.java import javax.swing.JFrame; import ...........; public class

我在为JButton添加ActionListener时遇到问题,请帮助解决此问题

错误:

Exception in thread "main" java.lang.NullPointerException
at searchDB.searchDB(searchDB.java:11)
at Ramses.main(Ramses.java:35)
主类:Ramses.java

import javax.swing.JFrame;
import ...........;

public class Ramses {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Gui GuiObject = new Gui();
    GuiObject.Gui();

    searchDB searchObject = new searchDB();
    searchObject.searchDB(); //error here

}
}
声明JButton的类:Gui.java

import javax.swing.*;
import........;

public class Gui {
public static JButton btnUpdate;
public void Gui() {
JButton btnSearch = new JButton("Search");
    btnSearch.setBounds(463, 112, 91, 23);
    btnSearch.setVisible(true);
    pnUpper.add(btnSearch);

 }
}
实现JButton ActionListener的类:searchDB.java

import javax.swing.*;

public class searchDB{

public void searchDB(){

    HandlerClass handler = new HandlerClass();
    Gui.btnSearch.addActionListener(handler); //error in this line

}
private class HandlerClass implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent event) {
        // TODO Auto-generated method stub
        String cstmrSearch = (String) Gui.cbCustomer.getSelectedItem();
        System.out.println("Selected Customer is :"+cstmrSearch);
    }


}
}

你知道这段代码有什么问题吗?

堆栈跟踪是问题的良好指示器

Gui的构造函数中删除
void
关键字

public Gui() {
允许分配组件变量。此外,删除构造函数中的
JButton
类型,以确保变量不是:


旁白:
静态
字段被认为是糟糕的设计,请改用实例变量

如果您打算将构造函数添加到
类Gui
类searchDB
,则不应将void添加为返回类型

添加void将使其成为一种正常的方法。构造函数将没有返回类型。您还可以在构造函数中包含初始化代码,并且在创建类的对象时将进行初始化。无需进行任何显式调用

Class Gui {

public Gui(){
 //initialization code goes here
}

}

Class searchDB{

public searchDB(){
 //initialization code goes here
}
}

我会设计一些不同的课程。我同意@Reimeus的观点,您应该避免误用静态字段,并且应该避免使用“伪”构造函数,即返回类型为void的构造函数,因为构造函数应该没有返回类型

具体来说,我要改变这一点:

public class Ramses {
  public static void main(String[] args) {
    Gui GuiObject = new Gui();
    GuiObject.Gui();
    searchDB searchObject = new searchDB();
    searchObject.searchDB(); //error here
  }
}
为此:

public class Ramses {
  public static void main(String[] args) {
    Gui gui = new Gui();  // variables should begin with lower-case letter
    // GuiObject.Gui();  // not needed
    SearchDB searchObject = new SearchDB(gui); // pass GUI object in
     // searchObject.searchDB(); // don't need this
  }
}
public class Gui {
  private JButton btnUpdate; // make private and non-static
  public Gui() {
    // JButton btnSearch = new JButton("Search");
    //  btnSearch.setBounds(463, 112, 91, 23); // don't use absolute positioning
    //  btnSearch.setVisible(true);  // not needed

    btnUpdate = new btnUpdate("Search");
    pnUpper.add(btnSearch);
 }

 public AbstractButton getBtnUpdate() {
    return btnUpdate;
 }
}
从以下位置更改Gui:

public class Gui {
public static JButton btnUpdate;
public void Gui() {
JButton btnSearch = new JButton("Search");
    btnSearch.setBounds(463, 112, 91, 23);
    btnSearch.setVisible(true);
    pnUpper.add(btnSearch);

 }
}
为此:

public class Ramses {
  public static void main(String[] args) {
    Gui gui = new Gui();  // variables should begin with lower-case letter
    // GuiObject.Gui();  // not needed
    SearchDB searchObject = new SearchDB(gui); // pass GUI object in
     // searchObject.searchDB(); // don't need this
  }
}
public class Gui {
  private JButton btnUpdate; // make private and non-static
  public Gui() {
    // JButton btnSearch = new JButton("Search");
    //  btnSearch.setBounds(463, 112, 91, 23); // don't use absolute positioning
    //  btnSearch.setVisible(true);  // not needed

    btnUpdate = new btnUpdate("Search");
    pnUpper.add(btnSearch);
 }

 public AbstractButton getBtnUpdate() {
    return btnUpdate;
 }
}
并将searchDB更改为:

public class searchDB{

public void searchDB(){

    HandlerClass handler = new HandlerClass();
    Gui.btnSearch.addActionListener(handler); //error in this line

}
private class HandlerClass implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent event) {
        // TODO Auto-generated method stub
        String cstmrSearch = (String) Gui.cbCustomer.getSelectedItem();
        System.out.println("Selected Customer is :"+cstmrSearch);
    }


}
}
致:


(请参见代码中的注释以获取解释)

谢谢大家的回答,这真的很有帮助。