单击鼠标滚动数据库-JavaDerby

单击鼠标滚动数据库-JavaDerby,java,database,derby,Java,Database,Derby,我正在尝试创建一个JavaDerby数据库,它必须在单击按钮时显示下一条记录。我下面的教程是: homeandrearn.co.uk/java/database_scrolling_buttons.html 在按钮的方法中,我有以下代码: String host=“jdbc:derby://localhost:1527/Employees"; 字符串uName=“bjorn”; 字符串uPass=“”; con=DriverManager.getConnection(主机、uName、uPass

我正在尝试创建一个JavaDerby数据库,它必须在单击按钮时显示下一条记录。我下面的教程是:
homeandrearn.co.uk/java/database_scrolling_buttons.html
在按钮的方法中,我有以下代码:

String host=“jdbc:derby://localhost:1527/Employees";
字符串uName=“bjorn”;
字符串uPass=“”;
con=DriverManager.getConnection(主机、uName、uPass);
PreparedStatement pstmt=con.prepareStatement(“从App.Workers中选择*,结果集类型不敏感,结果集一致性可更新”);
结果集rs=pstmt.executeQuery();
rs.next();
如果(rs.next()){
int id_col=rs.getInt(“id”);
String id=Integer.toString(id\u col);
String first_name=rs.getString(“first_name”);
String last_name=rs.getString(“last_name”);
String job=rs.getString(“job_Title”);
textID.setText(id);
textFirstName.setText(first_name);
text lastname.setText(姓氏);
textJobTitle.setText(作业);
}
当我运行应用程序并单击按钮一次时,它会显示下一条记录。但是如果我再次单击,应用程序就会崩溃。我想在多次单击按钮时滚动整个数据库。我是否必须在此方法中再次声明连接
con
和结果集
rs
?如果我不这样做,代码将变为:

if(rs.next()){
int id_col=rs.getInt(“id”);
String id=Integer.toString(id\u col);
String first_name=rs.getString(“first_name”);
String last_name=rs.getString(“last_name”);
String job=rs.getString(“job_Title”);
textID.setText(id);
textFirstName.setText(first_name);
text lastname.setText(姓氏);
textJobTitle.setText(作业);
}
现在我得到了错误消息:

线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常 在Employees.Workers.btnNextActionPerformed(Workers.java:255) 在Employees.Workers.access$200(Workers.java:19) 在Employees.Workers$3.actionPerformed(Workers.java:145) 在javax.swing.AbstractButton.fireActionPerformed上(AbstractButton.java:2018) 位于javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 在javax.swing.DefaultButtonModel.fireActionPerformed上(DefaultButtonModel.java:402) 在javax.swing.DefaultButtonModel.setPressed中(DefaultButtonModel.java:259) 在javax.swing.plaf.basic.BasicButtonListener.MouseRelease(BasicButtonListener.java:252) 位于java.awt.Component.ProcessMouseeEvent(Component.java:6505) 位于javax.swing.JComponent.ProcessMouseeEvent(JComponent.java:3321) 位于java.awt.Component.processEvent(Component.java:6270) 位于java.awt.Container.processEvent(Container.java:2229) 位于java.awt.Component.dispatchEventImpl(Component.java:4861) 位于java.awt.Container.dispatchEventImpl(Container.java:2287) 位于java.awt.Component.dispatchEvent(Component.java:4687) 位于java.awt.LightweightDispatcher.RetargetMouseeEvent(Container.java:4832) 位于java.awt.LightweightDispatcher.ProcessMouseeEvent(Container.java:4492) 位于java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 位于java.awt.Container.dispatchEventImpl(Container.java:2273) 位于java.awt.Window.dispatchEventImpl(Window.java:2719) 位于java.awt.Component.dispatchEvent(Component.java:4687) 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723) 在java.awt.EventQueue.access$200(EventQueue.java:103) 在java.awt.EventQueue$3.run(EventQueue.java:682) 在java.awt.EventQueue$3.run(EventQueue.java:680) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 在java.awt.EventQueue$4.run(EventQueue.java:696) 在java.awt.EventQueue$4.run(EventQueue.java:694) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:693) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)中 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:151) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 位于java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
第255行指向
if(rs.next()){
并显示错误,因为
rs
指向空对象。如何让
rs
指向数据库中的上一条记录,以便rs.next()指向下一条记录?

在此处声明和初始化rs变量时,您知道:

String host = "jdbc:derby://localhost:1527/Employees";
String uName = "bjorn";
String uPass= "";
con = DriverManager.getConnection( host, uName, uPass );
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM  App.Workers",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSet rs = pstmt.executeQuery();  // ****** here 
rs.next();
您的rs变量是局部变量,因此您只初始化了一个局部变量,而不是一个类字段。很可能这个局部变量隐藏了一个类字段,这就是您遇到问题的原因

如果是这样,解决方案不是重新声明rs变量,而是初始化rs类字段,而不是局部变量:

// ResultSet rs = pstmt.executeQuery();  // ****** here 
rs = pstmt.executeQuery();  // ****** Note the difference

如果应用程序崩溃,您需要帮助,您必须显示完整的错误消息,并指出导致异常发生的代码行。否则,您要求我们猜测和阅读,这是我们不擅长做的事情。当我省略上面的代码行时,如果(rs.next()){它显示以下错误消息:线程“AWT-EventQueue-0”java.lang.NullPointerException at Employees.Workers.btnNextActionPerformed(Workers.java:255)at Employees.Workers.access$200(Workers.java:19)at Employees.Workers$3.actionPerformed(Workers.java:145)行255点if(rs.next()){因为rs po