当从Jmenu中选择项并单击按钮时发生java.lang.NullPointerException
这是一个从数据库获取数据的Jmenu。错误是当按下查看定义按钮时,相应的事件不会被触发。理想情况下,当用户从Jmenu中选择一个项目并按下此按钮时,数据库将再次连接,以根据从Jmenu中选择的项目从数据库中获取相应的值。但是声明当从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
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);
}
}