当从Jmenu中选择项并单击按钮时发生java.lang.NullPointerException

当从Jmenu中选择项并单击按钮时发生java.lang.NullPointerException,java,swing,nullpointerexception,jbutton,jlist,Java,Swing,Nullpointerexception,Jbutton,Jlist,这是一个从数据库获取数据的Jmenu。错误是当按下查看定义按钮时,相应的事件不会被触发。理想情况下,当用户从Jmenu中选择一个项目并按下此按钮时,数据库将再次连接,以根据从Jmenu中选择的项目从数据库中获取相应的值。但是声明 ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'"); 似乎从未执行并抛出错误 datajava.lang.NullPointe

这是一个从数据库获取数据的Jmenu。错误是当按下查看定义按钮时,相应的事件不会被触发。理想情况下,当用户从Jmenu中选择一个项目并按下此按钮时,数据库将再次连接,以根据从Jmenu中选择的项目从数据库中获取相应的值。但是声明

ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'"); 
似乎从未执行并抛出错误

datajava.lang.NullPointerException
导致此问题的错误是什么?如何解决此问题?这是我的代码:-

public class ListModelExample extends JPanel {

  JList list;

  DefaultListModel model;

  public ListModelExample() {
    setLayout(new BorderLayout());
    model = new DefaultListModel();
    list = new JList(model);
    JScrollPane pane = new JScrollPane(list);
    JButton addButton = new JButton("View Definition");

     Connection con;
      ResultSet rs;
      Statement st = null;

    try {  

        File dbFile = new File("executive_db.accdb");
        String path = dbFile.getAbsolutePath();
        con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ= " + path);
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
       st = con.createStatement();


       } 
    catch (Exception e)
    {  
JOptionPane.showMessageDialog(null,"Failed to Connect to Database","Error Connection", JOptionPane.WARNING_MESSAGE);  
System.exit(0);  
   }  


 try {  
     model.clear();  
     rs=st.executeQuery("select Metric_Name from Metrics");  
     while (rs.next())
     {  

         model.addElement(rs.getString("Metric_Name"));  
     }  

    } 
 catch (Exception e)
    {  
     System.out.println("Error in fetching data");  
    }
   addButton.addActionListener(new ActionListener() {
      Statement st;

    public void actionPerformed(ActionEvent e) {

          String def = ""; 


          try {  

                 model.clear();  
                 st = null;
                 System.out.println("came here");
                 ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'");  
                 System.out.println("came here too");
                 while (rs.next())
                 {  

                     def = rs.getString("Metric_Name");

                     System.out.println(def);
                   //  model.addElement(rs.getString("Metric_Name"));  
                 }  

                } 
             catch (Exception e1)
                {  
                 System.out.println("Error in fetching data"+e1);  
                }
          System.out.println(def);
          JOptionPane.showMessageDialog(null, def, "Error", JOptionPane.ERROR_MESSAGE);
      /*  model.addElement("Element " + counter);
        counter++;*/
      }
    });

    add(pane, BorderLayout.NORTH);
    add(addButton, BorderLayout.WEST);

  }

  public static void main(String s[]) {
    JFrame frame = new JFrame("List of Metrics used");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new ListModelExample());
    frame.setSize(260, 200);
    frame.setVisible(true);
  }
}
这是执行e1.printStackTrace()时出现的错误; 代码中的第94行是

ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'"); 


首先将
st
设置为null,然后尝试执行

             st = null;
             System.out.println("came here");
             ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'");  
相反,请调用con.prepareStatement(字符串sql)获取
st

查看您的代码:

st = null;
ResultSet rs = st.executeQuery(...);
如果未获得NullPointerException,则无法对null引用调用任何方法。您需要将
st
变量初始化为非null语句

                 st = null;
                 System.out.println("came here");
                 ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'");  
我注意到上面代码的这一部分,它确实会导致空指针

要解决此问题,请将此“st”的声明作为主类的字段或成员变量(ListModelExample)。并删除侦听器中的st=null和'Statement=st'成员变量声明

    File dbFile = new File("executive_db.accdb");
    String path = dbFile.getAbsolutePath();
    con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ= " + path);
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   st = con.createStatement();

只需将此添加到您的public void actionPerformed(ActionEvent e)方法中即可

st = con.createStatement();
完整代码:

public class ListModelExample extends JPanel {

      JList list;

      DefaultListModel model;
      Connection con;
      public ListModelExample() {
        setLayout(new BorderLayout());
        model = new DefaultListModel();
        list = new JList(model);
        JScrollPane pane = new JScrollPane(list);
        JButton addButton = new JButton("View Definition");


          ResultSet rs;
          Statement st = null;

        try {  

            File dbFile = new File("executive_db.accdb");
            String path = dbFile.getAbsolutePath();
            con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ= " + path);
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           st = con.createStatement();


           } 
        catch (Exception e)
        {  
    JOptionPane.showMessageDialog(null,"Failed to Connect to Database","Error Connection", JOptionPane.WARNING_MESSAGE);  
    System.exit(0);  
       }  


     try {  
         model.clear();  
         rs=st.executeQuery("select Metric_Name from Metrics");  
         while (rs.next())
         {  

             model.addElement(rs.getString("Metric_Name"));  
         }  

        } 
     catch (Exception e)
        {  
         System.out.println("Error in fetching data");  
        }
       addButton.addActionListener(new ActionListener() {
          Statement st;

        public void actionPerformed(ActionEvent e) {

              String def = ""; 
              st = null;

              try {  

                     model.clear();  

                     st = con.createStatement();
                     System.out.println("came here");
                     ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'");  
                     System.out.println("came here too");
                     while (rs.next())
                     {  

                         def = rs.getString("Metric_Name");

                         System.out.println(def);
                       //  model.addElement(rs.getString("Metric_Name"));  
                     }  

                    } 
                 catch (Exception e1)
                    {  
                     System.out.println("Error in fetching data"+e1);  
                    }
              System.out.println(def);
              JOptionPane.showMessageDialog(null, def, "Error", JOptionPane.ERROR_MESSAGE);
          /*  model.addElement("Element " + counter);
            counter++;*/
          }
        });

        add(pane, BorderLayout.NORTH);
        add(addButton, BorderLayout.WEST);

      }

      public static void main(String s[]) {
        JFrame frame = new JFrame("List of Metrics used");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new ListModelExample());
        frame.setSize(260, 200);
        frame.setVisible(true);
      }
    }

你能发布堆栈跟踪或日志吗?还要提供更多调试细节,请使用e.printStackTrace();将形式为
catch(异常e){..
的代码更改为
catch(异常e){e.printStackTrace();//非常有用!
@Andrew Thompson:先生,我现在更新了我的问题!好的。现在..哪一行是第94行?如果你发布一个(最小的完整且可验证的示例)接下来,我们可以很容易地看出::删除st=null alsso并不能解决问题,先生!如何解决这个问题?:那么如何解决这个问题?也感谢您的输入!请您帮助解决一件事。我想增加jmenu的高度,但不知怎的很难做到。我这样做的尝试要么增加了按钮的大小,要么使它们变大出现并且jmenu的大小没有影响。如何解决此问题?很抱歉,我无法解决您的问题。请共享示例代码并创建其他线程。谢谢。代码与上面相同。我只希望jmenu的高度增加
public class ListModelExample extends JPanel {

      JList list;

      DefaultListModel model;
      Connection con;
      public ListModelExample() {
        setLayout(new BorderLayout());
        model = new DefaultListModel();
        list = new JList(model);
        JScrollPane pane = new JScrollPane(list);
        JButton addButton = new JButton("View Definition");


          ResultSet rs;
          Statement st = null;

        try {  

            File dbFile = new File("executive_db.accdb");
            String path = dbFile.getAbsolutePath();
            con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ= " + path);
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           st = con.createStatement();


           } 
        catch (Exception e)
        {  
    JOptionPane.showMessageDialog(null,"Failed to Connect to Database","Error Connection", JOptionPane.WARNING_MESSAGE);  
    System.exit(0);  
       }  


     try {  
         model.clear();  
         rs=st.executeQuery("select Metric_Name from Metrics");  
         while (rs.next())
         {  

             model.addElement(rs.getString("Metric_Name"));  
         }  

        } 
     catch (Exception e)
        {  
         System.out.println("Error in fetching data");  
        }
       addButton.addActionListener(new ActionListener() {
          Statement st;

        public void actionPerformed(ActionEvent e) {

              String def = ""; 
              st = null;

              try {  

                     model.clear();  

                     st = con.createStatement();
                     System.out.println("came here");
                     ResultSet rs=st.executeQuery("select Metric_Name from Metrics where Metrics.Metric_Name='NAA'");  
                     System.out.println("came here too");
                     while (rs.next())
                     {  

                         def = rs.getString("Metric_Name");

                         System.out.println(def);
                       //  model.addElement(rs.getString("Metric_Name"));  
                     }  

                    } 
                 catch (Exception e1)
                    {  
                     System.out.println("Error in fetching data"+e1);  
                    }
              System.out.println(def);
              JOptionPane.showMessageDialog(null, def, "Error", JOptionPane.ERROR_MESSAGE);
          /*  model.addElement("Element " + counter);
            counter++;*/
          }
        });

        add(pane, BorderLayout.NORTH);
        add(addButton, BorderLayout.WEST);

      }

      public static void main(String s[]) {
        JFrame frame = new JFrame("List of Metrics used");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new ListModelExample());
        frame.setSize(260, 200);
        frame.setVisible(true);
      }
    }