Java 我不能解决这个问题;NullPointerException“;
我试图使用swing事件处理来访问数据库表记录,但按下按钮后显示异常。我不知道出了什么问题。这是我的密码:Java 我不能解决这个问题;NullPointerException“;,java,swing,jdbc,Java,Swing,Jdbc,我试图使用swing事件处理来访问数据库表记录,但按下按钮后显示异常。我不知道出了什么问题。这是我的密码: private void DisplayAllButtonActionPerformed(java.awt.event.Act ionEvent evt) { try { String SQL = "SELECT * FROM OCCUPANTS"; rs = stmt.executeQuery( SQL ); //line no 264
private void DisplayAllButtonActionPerformed(java.awt.event.Act ionEvent evt) {
try {
String SQL = "SELECT * FROM OCCUPANTS";
rs = stmt.executeQuery( SQL ); //line no 264
while( rs.next( )) {
int id_col = rs.getInt("ID");
String id=Integer.toString(id_col);
String room =rs.getString("ROOM");
String occupant = rs.getString("OCCUPANT");
DisplayArea.setText( id + " " + room + " " + occupant);
}
}
catch ( SQLException err ) {
System.out.println( err.getMessage( ) );
}
}
休闲是个例外:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at wumpus.WumpusGUI.DisplayAllButtonActionPerformed(W umpusGUI.java:264)
at wumpus.WumpusGUI.access$300(WumpusGUI.java:16)
at wumpus.WumpusGUI$4.actionPerformed(WumpusGUI.java: 164)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.jav a:6505)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3321)
at java.awt.Component.processEvent(Component.java:627 0)
at java.awt.Container.processEvent(Container.java:222 9)
at java.awt.Component.dispatchEventImpl(Component.jav a:4861)
at java.awt.Container.dispatchEventImpl(Container.jav a:2287)
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4422)
at java.awt.Container.dispatchEventImpl(Container.jav a:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719 )
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:703)
at java.awt.EventQueue.access$000(EventQueue.java:102 )
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 673)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:97)
BUILD SUCCESSFUL (total time: 28 seconds)
下面是stmt的全局初始化
public class WumpusGUI extends javax.swing.JFrame {
Connection con;
Statement stmt;
ResultSet rs;
/**
* Creates new form WumpusGUI
*/
public WumpusGUI() {
initComponents();
DBConnect();
}
public void DBConnect() {
try {
String host = "jdbc:derby://localhost:1527/occupants";
String uName = "ravi";
String uPass= "ravi";
Connection con = DriverManager.getConnection( host, uName, uPass );
Statement stmt = con.createStatement();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
谢谢。好吧,您还没有显示stmt的声明位置,但听起来可能是空的。您希望在哪里将其设置为非空值
关于这一点,有两点:
- 每次执行查询时,应使用单独的
PreparedStatement
- 无论如何,您不应该在UI线程中执行数据库访问
(此外,方法名称违反Java命名约定。)
编辑:从您的评论中,您得到:
public class WumpusGUI ... {
Statement stmt;
public void DBConnect() {
...
Statement stmt = con.createStatement();
...
}
}
方法的这一行声明了一个新的局部变量-它没有为实例变量赋值,因此实例变量保持为null
最小的“修复”是将该行更改为:
stmt = con.createStatement();
。。。但正如我上面所说,这不是正确的解决办法。理想情况下,您应该首先从GUI类中获取所有这些数据库代码,但至少应该在每次执行时创建一条新语句。(然后在finally块中关闭它。)
编辑:另外,如果你在方法中得到一个异常,你只是打印出来,然后愉快地继续。。。所以你的stmt
变量仍然是空的。一般情况下,不要捕获异常,也不要捕获以后确实无法继续的异常。非常简单:stmt
尚未初始化。您的stamt变量可能已全局初始化为null,但您将无法分配必须从连接获取的值。签出您的代码。您必须调用DBConnect方法来初始化stmt变量beofer,或者使用它。什么是“stmt”在哪里声明/初始化?可以在WumpusGUI中显示第264行吗。java@Nirmal-thInkbeYond——我在评论中提到的第四行的第一个代码。我已经全局声明了“stmt”:“公共类WumpusGUI扩展了javax.swing.JFrame{Connection con;语句stmt;ResultSet rs;/***创建新表单WumpusGUI*/public WumpusGUI(){initComponents();DBConnect();}public void DBConnect(){try{String host=“jdbc:derby://localhost:1527/occupants“字符串uName=“ravi”;String uPass=“ravi”Connection con=DriverManager.getConnection(主机、uName、uPass);语句stmt=con.createStatement();}“@raviahuja请不要在评论中发布代码。编辑您的问题并添加此代码。@jon:我已经编辑了代码,请查看。thanks@raviahuja:我已编辑了我的答案-我将其误读为在构造函数中,但您的答案中也有相同的问题(名称不正确)DBConnect
method.@jon:我现在更改了这个名称,但仍然存在同样的问题